patch 9.2.0894: filetype: ed script files not recognised
Commit:
https://github.com/vim/vim/commit/c28515b9992e52f49c3fd90484601c248c672aec
Author: Doug Kearns <
dougk...@gmail.com>
Date: Sat Aug 1 13:57:32 2026 +0000
patch 9.2.0894: filetype: ed script files not recognised
Problem: filetype: ed script files not recognised.
Solution: Add filetype detection for *.ed files and shebang lines,
include syntax script and syntax tests.
Features of the ed syntax file:
- BSD and GNU extensions are supported
- Andrew L. Moore's ed extensions are not supported
- Rebuild synmenu.vim
closes: #19602
Signed-off-by: Doug Kearns <
dougk...@gmail.com>
Signed-off-by: Christian Brabandt <
c...@256bit.org>
diff --git a/.github/MAINTAINERS b/.github/MAINTAINERS
index 44ccadf6b..9b221eb7a 100644
--- a/.github/MAINTAINERS
+++ b/.github/MAINTAINERS
@@ -544,6 +544,7 @@ runtime/syntax/dot.vim @mmottl
runtime/syntax/doxygen.vim @frogonwheels
runtime/syntax/dtd.vim @chrisbra
runtime/syntax/dts.vim @zonque
+runtime/syntax/ed.vim @dkearns
runtime/syntax/editorconfig.vim @gpanders
runtime/syntax/eiffel.vim @jocelyn
runtime/syntax/erlang.vim @hcs42
diff --git a/runtime/autoload/dist/ft.vim b/runtime/autoload/dist/ft.vim
index 0d1e7119c..398e2ae26 100644
--- a/runtime/autoload/dist/ft.vim
+++ b/runtime/autoload/dist/ft.vim
@@ -3,7 +3,7 @@ vim9script
# Vim functions for file type detection
#
# Maintainer: The Vim Project <
https://github.com/vim/vim>
-# Last Change: 2026 Jul 28
+# Last Change: 2026 Jul 30
# Former Maintainer: Bram Moolenaar <
Br...@vim.org>
# These functions are moved here from runtime/filetype.vim to make startup
@@ -2053,6 +2053,8 @@ const ft_from_ext = {
"overlay": "dts",
# Embedix Component Description
"ecd": "ecd",
+ # ed(1)
+ "ed": "ed",
# ERicsson LANGuage; Yaws is erlang too
"erl": "erlang",
"hrl": "erlang",
diff --git a/runtime/autoload/dist/script.vim b/runtime/autoload/dist/script.vim
index 3f9a5acfd..61e6cec59 100644
--- a/runtime/autoload/dist/script.vim
+++ b/runtime/autoload/dist/script.vim
@@ -243,6 +243,10 @@ export def Exe2filetype(name: string, line1: string): string
elseif name =~ '^vim\>'
return 'vim'
+ # ed(1)
+ elseif name =~ '^ed\>'
+ return 'ed'
+
endif
return ''
diff --git a/runtime/makemenu.vim b/runtime/makemenu.vim
index 6611f737c..79d188a92 100644
--- a/runtime/makemenu.vim
+++ b/runtime/makemenu.vim
@@ -1,8 +1,8 @@
vim9script
# Script to define the syntax menu in synmenu.vim
-# Maintainer: The Vim Project <
https://github.com/vim/vim>
-# Last Change: 2025 Mar 09
+# Maintainer: The Vim Project <
https://github.com/vim/vim>
+# Last Change: 2026 Jul 30
# Former Maintainer: Bram Moolenaar <
Br...@vim.org>
# This is used by "make menu" in the src directory.
@@ -205,6 +205,7 @@ SynMenu DE.Dylan.Dylan\ interface:dylanintr
SynMenu DE.Dylan.Dylan\ lid:dylanlid
SynMenu DE.EDIF:edif
+SynMenu DE.Ed:ed
SynMenu DE.Eiffel:eiffel
SynMenu DE.Eight:8th
SynMenu DE.Elinks\ config:elinks
diff --git a/runtime/synmenu.vim b/runtime/synmenu.vim
index c26c128b3..17241ff28 100644
--- a/runtime/synmenu.vim
+++ b/runtime/synmenu.vim
@@ -110,46 +110,46 @@ 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.140 &Syntax.C.Cangjie :cal SetSyn("cangjie")<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.20.150 &Syntax.C.Cangjie :cal SetSyn("cangjie")<CR>
+an 50.20.160 &Syntax.C.Cascading\ Style\ Sheets :cal SetSyn("css")<CR>
+an 50.20.170 &Syntax.C.CDL :cal SetSyn("cdl")<CR>
+an 50.20.180 &Syntax.C.Cdrdao\ TOC :cal SetSyn("cdrtoc")<CR>
+an 50.20.190 &Syntax.C.Cdrdao\ config :cal SetSyn("cdrdaoconf")<CR>
+an 50.20.200 &Syntax.C.Century\ Term :cal SetSyn("cterm")<CR>
+an 50.20.210 &
Syntax.C.CH\ script :cal SetSyn("ch")<CR>
+an 50.20.220 &Syntax.C.ChaiScript :cal SetSyn("chaiscript")<CR>
+an 50.20.230 &Syntax.C.ChangeLog :cal SetSyn("changelog")<CR>
+an 50.20.240 &Syntax.C.CHILL :cal SetSyn("chill")<CR>
+an 50.20.250 &Syntax.C.Cheetah\ template :cal SetSyn("cheetah")<CR>
+an 50.20.260 &Syntax.C.Chicken :cal SetSyn("chicken")<CR>
+an 50.20.270 &Syntax.C.ChordPro :cal SetSyn("chordpro")<CR>
+an 50.20.280 &Syntax.C.Clean :cal SetSyn("clean")<CR>
+an 50.20.290 &Syntax.C.Clever :cal SetSyn("cl")<CR>
+an 50.20.300 &Syntax.C.Clipper :cal SetSyn("clipper")<CR>
+an 50.20.310 &Syntax.C.Clojure :cal SetSyn("clojure")<CR>
+an 50.20.320 &Syntax.C.Cmake :cal SetSyn("cmake")<CR>
+an 50.20.330 &Syntax.C.Cmod :cal SetSyn("cmod")<CR>
+an 50.20.340 &Syntax.C.Cmusrc :cal SetSyn("cmusrc")<CR>
+an 50.20.350 &Syntax.C.Cobol :cal SetSyn("cobol")<CR>
+an 50.20.360 &Syntax.C.Coco/R :cal SetSyn("coco")<CR>
+an 50.20.370 &Syntax.C.Cold\ Fusion :cal SetSyn("cf")<CR>
+an 50.20.380 &Syntax.C.Conary\ Recipe :cal SetSyn("conaryrecipe")<CR>
+an 50.20.390 &Syntax.C.Config.Cfg\ Config\ file :cal SetSyn("cfg")<CR>
+an 50.20.400 &Syntax.C.Config.Configure\.in :cal SetSyn("config")<CR>
+an 50.20.410 &Syntax.C.Config.Generic\ Config\ file :cal SetSyn("conf")<CR>
+an 50.20.420 &Syntax.C.CRM114 :cal SetSyn("crm")<CR>
+an 50.20.430 &Syntax.C.Crontab :cal SetSyn("crontab")<CR>
+an 50.20.440 &Syntax.C.CSDL :cal SetSyn("csdl")<CR>
+an 50.20.450 &Syntax.C.CSP :cal SetSyn("csp")<CR>
+an 50.20.460 &Syntax.C.Ctrl-H :cal SetSyn("ctrlh")<CR>
+an 50.20.470 &Syntax.C.Cucumber :cal SetSyn("cucumber")<CR>
+an 50.20.480 &Syntax.C.CUDA :cal SetSyn("cuda")<CR>
+an 50.20.490 &Syntax.C.CUPL.CUPL :cal SetSyn("cupl")<CR>
+an 50.20.500 &Syntax.C.CUPL.Simulation :cal SetSyn("cuplsim")<CR>
+an 50.20.510 &Syntax.C.CVS.commit\ file :cal SetSyn("cvs")<CR>
+an 50.20.520 &Syntax.C.CVS.cvsrc :cal SetSyn("cvsrc")<CR>
+an 50.20.530 &Syntax.C.Cyn++ :cal SetSyn("cynpp")<CR>
+an 50.20.540 &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>
@@ -189,23 +189,24 @@ 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.30.500 &Syntax.DE.Ed :cal SetSyn("ed")<CR>
+an 50.30.510 &Syntax.DE.Eiffel :cal SetSyn("eiffel")<CR>
+an 50.30.520 &Syntax.DE.Eight :cal SetSyn("8th")<CR>
+an 50.30.530 &Syntax.DE.Elinks\ config :cal SetSyn("elinks")<CR>
+an 50.30.540 &Syntax.DE.Elm\ filter\ rules :cal SetSyn("elmfilt")<CR>
+an 50.30.550 &Syntax.DE.Embedix\ Component\ Description :cal SetSyn("ecd")<CR>
+an 50.30.560 &Syntax.DE.ERicsson\ LANGuage :cal SetSyn("erlang")<CR>
+an 50.30.570 &Syntax.DE.ESMTP\ rc :cal SetSyn("esmtprc")<CR>
+an 50.30.580 &Syntax.DE.ESQL-C :cal SetSyn("esqlc")<CR>
+an 50.30.590 &Syntax.DE.Essbase\ script :cal SetSyn("csc")<CR>
+an 50.30.600 &Syntax.DE.Esterel :cal SetSyn("esterel")<CR>
+an 50.30.610 &Syntax.DE.Eterm\ config :cal SetSyn("eterm")<CR>
+an 50.30.620 &Syntax.DE.Euphoria\ 3 :cal SetSyn("euphoria3")<CR>
+an 50.30.630 &Syntax.DE.Euphoria\ 4 :cal SetSyn("euphoria4")<CR>
+an 50.30.640 &Syntax.DE.Eviews :cal SetSyn("eviews")<CR>
+an 50.30.650 &Syntax.DE.Exim\ conf :cal SetSyn("exim")<CR>
+an 50.30.660 &Syntax.DE.Expect :cal SetSyn("expect")<CR>
+an 50.30.670 &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>
@@ -257,57 +258,57 @@ 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.205 &Syntax.HIJK.HIP :cal SetSyn("hip")<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.50.210 &Syntax.HIJK.HIP :cal SetSyn("hip")<CR>
+an 50.50.220 &Syntax.HIJK.Hollywood :cal SetSyn("hollywood")<CR>
+an 50.50.230 &Syntax.HIJK.HTML.HTML :cal SetSyn("html")<CR>
+an 50.50.240 &Syntax.HIJK.HTML.HTML\ with\ M4 :cal SetSyn("htmlm4")<CR>
+an 50.50.250 &Syntax.HIJK.HTML.HTML\ with\ Ruby\ (eRuby) :cal SetSyn("eruby")<CR>
+an 50.50.260 &Syntax.HIJK.HTML.Cheetah\ HTML\ template :cal SetSyn("htmlcheetah")<CR>
+an 50.50.270 &Syntax.HIJK.HTML.Django\ HTML\ template :cal SetSyn("htmldjango")<CR>
+an 50.50.280 &Syntax.HIJK.HTML.Vue.js\ HTML\ template :cal SetSyn("vuejs")<CR>
+an 50.50.290 &Syntax.HIJK.HTML.HTML/OS :cal SetSyn("htmlos")<CR>
+an 50.50.300 &Syntax.HIJK.HTML.XHTML :cal SetSyn("xhtml")<CR>
+an 50.50.310 &Syntax.HIJK.Host\.conf :cal SetSyn("hostconf")<CR>
+an 50.50.320 &Syntax.HIJK.Hosts\ access :cal SetSyn("hostsaccess")<CR>
+an 50.50.330 &Syntax.HIJK.Hyper\ Builder :cal SetSyn("hb")<CR>
+an 50.50.350 &Syntax.HIJK.Icewm\ menu :cal SetSyn("icemenu")<CR>
+an 50.50.360 &Syntax.HIJK.Icon :cal SetSyn("icon")<CR>
+an 50.50.370 &Syntax.HIJK.IDL\Generic\ IDL :cal SetSyn("idl")<CR>
+an 50.50.380 &Syntax.HIJK.IDL\Microsoft\ IDL :cal SetSyn("msidl")<CR>
+an 50.50.390 &Syntax.HIJK.Indent\ profile :cal SetSyn("indent")<CR>
+an 50.50.400 &Syntax.HIJK.Inform :cal SetSyn("inform")<CR>
+an 50.50.410 &Syntax.HIJK.Informix\ 4GL :cal SetSyn("fgl")<CR>
+an 50.50.420 &Syntax.HIJK.Initng :cal SetSyn("initng")<CR>
+an 50.50.430 &Syntax.HIJK.Inittab :cal SetSyn("inittab")<CR>
+an 50.50.440 &Syntax.HIJK.Inno\ setup :cal SetSyn("iss")<CR>
+an 50.50.450 &Syntax.HIJK.Innovation\ Data\ Processing.Upstream\ dat :cal SetSyn("upstreamdat")<CR>
+an 50.50.460 &Syntax.HIJK.Innovation\ Data\ Processing.Upstream\ log :cal SetSyn("upstreamlog")<CR>
+an 50.50.470 &Syntax.HIJK.Innovation\ Data\ Processing.Upstream\ rpt :cal SetSyn("upstreamrpt")<CR>
+an 50.50.480 &Syntax.HIJK.Innovation\ Data\ Processing.Upstream\ Install\ log :cal SetSyn("upstreaminstalllog")<CR>
+an 50.50.490 &Syntax.HIJK.Innovation\ Data\ Processing.Usserver\ log :cal SetSyn("usserverlog")<CR>
+an 50.50.500 &Syntax.HIJK.Innovation\ Data\ Processing.USW2KAgt\ log :cal SetSyn("usw2kagtlog")<CR>
+an 50.50.510 &Syntax.HIJK.InstallShield\ script :cal SetSyn("ishd")<CR>
+an 50.50.520 &Syntax.HIJK.Interactive\ Data\ Lang :cal SetSyn("idlang")<CR>
+an 50.50.530 &Syntax.HIJK.IPfilter :cal SetSyn("ipfilter")<CR>
+an 50.50.550 &Syntax.HIJK.J :cal SetSyn("j")<CR>
+an 50.50.560 &Syntax.HIJK.JAL :cal SetSyn("jal")<CR>
+an 50.50.570 &Syntax.HIJK.JAM :cal SetSyn("jam")<CR>
+an 50.50.580 &Syntax.HIJK.Jargon :cal SetSyn("jargon")<CR>
+an 50.50.590 &Syntax.HIJK.Java.Java :cal SetSyn("java")<CR>
+an 50.50.600 &Syntax.HIJK.Java.JavaCC :cal SetSyn("javacc")<CR>
+an 50.50.610 &Syntax.HIJK.Java.Java\ Server\ Pages :cal SetSyn("jsp")<CR>
+an 50.50.620 &Syntax.HIJK.Java.Java\ Properties :cal SetSyn("jproperties")<CR>
+an 50.50.630 &Syntax.HIJK.JavaScript :cal SetSyn("javascript")<CR>
+an 50.50.640 &Syntax.HIJK.JavaScriptReact :cal SetSyn("javascriptreact")<CR>
+an 50.50.650 &Syntax.HIJK.Jess :cal SetSyn("jess")<CR>
+an 50.50.660 &Syntax.HIJK.Jgraph :cal SetSyn("jgraph")<CR>
+an 50.50.670 &Syntax.HIJK.Jovial :cal SetSyn("jovial")<CR>
+an 50.50.680 &Syntax.HIJK.JSON :cal SetSyn("json")<CR>
+an 50.50.700 &Syntax.HIJK.Kconfig :cal SetSyn("kconfig")<CR>
+an 50.50.710 &Syntax.HIJK.KDE\ script :cal SetSyn("kscript")<CR>
+an 50.50.720 &Syntax.HIJK.Kimwitu++ :cal SetSyn("kwt")<CR>
+an 50.50.730 &Syntax.HIJK.Kivy :cal SetSyn("kivy")<CR>
+an 50.50.740 &Syntax.HIJK.KixTart :cal SetSyn("kix")<CR>
an 50.60.100 &Syntax.L.Lace :cal SetSyn("lace")<CR>
an 50.60.110 &Syntax.L.LambdaProlog :cal SetSyn("lprolog")<CR>
an 50.60.120 &Syntax.L.Latte :cal SetSyn("latte")<CR>
diff --git a/runtime/syntax/ed.vim b/runtime/syntax/ed.vim
new file mode 100644
index 000000000..393e225b0
--- /dev/null
+++ b/runtime/syntax/ed.vim
@@ -0,0 +1,616 @@
+" Vim syntax file
+" Language: ed(1)
+" Maintainer: Doug Kearns <
dougk...@gmail.com>
+" Last Change: 2026 Jul 30
+
+if exists("b:current_syntax")
+ finish
+endif
+let s:cpo_save = &cpo
+set cpo&vim
+
+syn match edLineStart
+ \ /^/
+ \ skipwhite
+ \ nextgroup=@edAddress,edAddressSeparator,@edCommand
+
+" Addresses {{{1
+
+" TODO: Rename edAddress_Line, edAdress_Mark etc?
+syn match edAddress contained
+ \ /[.$]\|\d\+\|'[a-z]/
+ \ skipwhite
+ \ nextgroup=@edAddressModifier,edAddressSeparator,@edCommand
+syn region edAddress_Pattern contained
+ \ matchgroup=Delimiter
+ \ start=+/+
+ \ end=+/\|$+
+ \ skipwhite
+ \ nextgroup=@edAddressModifier,
+ \ edAddressSeparator,
+ \ @edCommand,
+ \ edAddress_Pattern_Flag
+ \ contains=edRegex_SlashEscape,
+ \ edRegex_BackslashEscape,
+ \ edRegex_BracketExpression
+syn region edAddress_Pattern contained
+ \ matchgroup=Delimiter
+ \ start=/?/
+ \ end=/?\|$/
+ \ skipwhite
+ \ nextgroup=@edAddressModifier,
+ \ edAddressSeparator,
+ \ @edCommand,
+ \ edAddress_Pattern_Flag
+ \ contains=edRegex_QuestionMarkEscape,
+ \ edRegex_BackslashEscape,
+ \ edRegex_BracketExpression
+
+syn match edAddress_Pattern_Flag contained
+ \ +[/?]\@1<=I+
+ \ skipwhite
+ \ nextgroup=@edAddressModifier,edAddressSeparator,@edCommand
+
+syn match edRegex_BracketExpression contained
+ \ "\[\^\=\]\=\%(\[:.\{-}:\]\|\[\..\{-}\.\]\|\[=.\{-}=\]\|[^]]\)*\]"
+ \ contains=NONE
+ \ transparent
+syn match edRegex_SlashEscape contained
+ \ +\/+
+ \ contains=NONE
+ \ transparent
+syn match edRegex_QuestionMarkEscape contained
+ \ /\?/
+ \ contains=NONE
+ \ transparent
+syn match edRegex_BackslashEscape contained
+ \ /\\/
+ \ contains=NONE
+ \ transparent
+syn match edRegex_EscapeSequence contained
+ \ /\./
+ \ contains=NONE
+ \ transparent
+
+
+syn cluster edAddress
+ \ contains=edAddress,edAddress_Pattern,edAddressModifier_Offset
+
+syn match edAddressModifier_Offset contained
+ \ /[+-]\s*\%(\d\+\)\=/
+ \ skipwhite
+ \ nextgroup=@edAddressModifier,edAddressSeparator,@edCommand
+" BSD extension
+syn match edAddressModifier_Offset contained
+ \ /\^\s*\%(\d\+\)\=/
+ \ skipwhite
+ \ nextgroup=@edAddressModifier,edAddressSeparator,@edCommand
+syn match edAddressModifier_Count contained
+ \ /\d\+/
+ \ skipwhite
+ \ nextgroup=@edAddressModifier,edAddressSeparator,@edCommand
+syn cluster edAddressModifier
+ \ contains=edAddressModifier_Offset,edAddressModifier_Count
+
+syn match edAddressSeparator contained
+ \ /[,;]/
+ \ skipwhite
+ \ nextgroup=@edAddress,edAddressSeparator,@edCommand
+" BSD/GNU extension
+syn match edAddressSeparator contained
+ \ /%/
+ \ skipwhite
+ \ nextgroup=@edAddress,edAddressSeparator,@edCommand
+
+" Commands {{{1
+
+" Append Command {{{2
+syn match edCommand_Append contained
+ \ /a/
+ \ skipnl
+ \ nextgroup=@edCommandPrint_InputMode,
+ \ edArg_InputMode_Text,
+ \ edArg_InputMode_EndMarker,
+ \ edLineContinue_InputMode
+
+syn match edArg_InputMode_EndMarker contained
+ \ /^\.\ze\%(\s*\\)\=$/
+
+syn region edArg_InputMode_Text contained
+ \ start=/^\%(\.$\)\@!/
+ "\ end=/^\.$/
+ \ matchgroup=edArg_InputMode_EndMarker
+ "\ TODO: remove \?
+ \ end=/^\.\ze\%(\s*\\)\=$/
+ \ fold
+syn region edArg_InputMode_Text_Global contained
+ \ start=/^\%(\.$\)\@!/
+ \ end=/\ze\\@1<!
/
+ \ matchgroup=edArg_InputMode_EndMarker
+ \ end=/^\.\ze\%(\s*\\)\=$/
+ \ skipwhite
+ \ nextgroup=edLineContinue
+ \ contains=edLineContinue_InputMode_Text
+ \ fold
+
+" Change Command {{{2
+syn match edCommand_Change contained
+ \ /c/
+ \ skipnl
+ \ nextgroup=@edCommandPrint_InputMode,
+ \ edArg_InputMode_Text,
+ \ edArg_InputMode_EndMarker,
+ \ edLineContinue_InputMode
+
+" Delete Command {{{2
+syn match edCommand_Delete contained
+ \ /d/
+ \ nextgroup=@edCommandPrint
+
+" TODO: maybe implement as a region so that the command list is contained?
+" Global Command {{{2
+syn match edCommand_Global contained
+ \ /g/
+ \ nextgroup=edCommand_Global_Arg_Regexp
+syn region edCommand_Global_Arg_Regexp contained
+ \ matchgroup=Delimiter
+ \ start=/\z([^\
]\)/
+ \ end=/\z1\|$/
+ \ skipwhite
+ \ nextgroup=@edAddress,
+ \ edAddressSeparator,
+ \ @edCommand,
+ \ edCommand_Global_Arg_Regexp_Flag
+ \ contains=edRegex_EscapeSequence,edRegex_BracketExpression
+
+" GNU extension
+syn match edCommand_Global_Arg_Regexp_Flag contained
+ \ /[^\
]\@1<=I/
+ \ skipwhite
+ \ nextgroup=@edAddress,edAddressSeparator,@edCommand
+
+syn match edLineContinue_InputMode contained
+ \ /\$/
+ \ skipnl
+ \ nextgroup=edArg_InputMode_Text_Global,edArg_InputMode_EndMarker
+syn match edLineContinue_InputMode_Text contained /\$/
+syn match edLineContinue /\$/ skipnl nextgroup=edLineStart
+
+" Interactive Global Command {{{2
+syn match edCommand_InteractiveGlobal contained
+ \ /G/
+ \ nextgroup=edCommand_InteractiveGlobal_Arg_Regexp
+syn region edCommand_InteractiveGlobal_Arg_Regexp contained
+ \ matchgroup=Delimiter
+ \ start=/\z([^\
]\)/
+ \ end=/\z1\|$/
+ \ nextgroup=edCommand_InteractiveGlobal_Arg_Regexp_Flag
+ \ contains=edRegex_EscapeSequence,edRegex_BracketExpression
+
+" GNU extension
+syn match edCommand_InteractiveGlobal_Arg_Regexp_Flag contained
+ \ /[^\
]\@1<=I/
+
+syn match edCommand_Repeat contained
+ \ /&/
+
+" Insert Command {{{2
+syn match edCommand_Insert contained
+ \ /i/
+ \ skipnl
+ \ nextgroup=@edCommandPrint_InputMode,
+ \ edArg_InputMode_Text,
+ \ edArg_InputMode_EndMarker,
+ \ edLineContinue_InputMode
+
+" Join Command {{{2
+syn match edCommand_Join contained
+ \ /j/
+ \ nextgroup=@edCommandPrint
+
+" Mark Command {{{2
+syn match edCommand_Mark contained
+ \ /k/
+ \ nextgroup=edCommand_Mark_Arg_Name
+syn match edCommand_Mark_Arg_Name contained
+ \ /[a-z]/
+ \ nextgroup=@edCommandPrint
+
+" List Command {{{2
+syn match edCommand_List contained
+ \ /l/
+ \ nextgroup=@edCommandPrint
+
+syn match edCommand_List_InputMode contained
+ \ /^\@1<!l/
+ \ skipnl
+ \ nextgroup=@edCommandPrint_InputMode,
+ \ edArg_InputMode_Text,
+ \ edArg_InputMode_EndMarker,
+ \ edLineContinue_InputMode
+
+" Move Command {{{2
+syn match edCommand_Move contained
+ \ /m/
+ "\ GNU extension
+ \ skipwhite
+ \ nextgroup=@edAddress,edAddressSeparator,@edCommandPrint
+
+" Number Command {{{2
+syn match edCommand_Number contained
+ \ /n/
+ \ nextgroup=@edCommandPrint
+
+syn match edCommand_Number_InputMode contained
+ \ /^\@1<!n/
+ \ skipnl
+ \ nextgroup=@edCommandPrint_InputMode,
+ \ edArg_InputMode_Text,
+ \ edArg_InputMode_EndMarker,
+ \ edLineContinue_InputMode
+
+" Print Command {{{2
+syn match edCommand_Print contained
+ \ /p/
+ \ nextgroup=@edCommandPrint
+
+syn match edCommand_Print_InputMode contained
+ \ /^\@1<!p/
+ \ skipnl
+ \ nextgroup=@edCommandPrint_InputMode,
+ \ edArg_InputMode_Text,
+ \ edArg_InputMode_EndMarker,
+ \ edLineContinue_InputMode
+
+" Read Command {{{2
+syn match edCommand_Read contained
+ \ /r\>/
+ \ skipwhite
+ \ nextgroup=edArg_File,edCommand_ShellEscape
+
+" Substitute Command {{{2
+syn match edCommand_Substitute contained
+ \ /s/
+ \ nextgroup=edCommand_Substitute_Arg_Regexp
+syn region edCommand_Substitute_Arg_Regexp contained
+ \ matchgroup=Delimiter
+ \ start=/\z([^\
]\)/
+ "\ /$/ so we don't run to EOF when editing
+ \ end=/\ze\z1\|$/
+ \ nextgroup=edCommand_Substitute_Arg_Replacement
+ \ contains=edRegex_EscapeSequence,edRegex_BracketExpression
+syn region edCommand_Substitute_Arg_Replacement contained
+ \ matchgroup=Delimiter
+ \ start=/\z(.\)/
+ \ skip=/\$/
+ \ end=/\z1\|$/
+ \ nextgroup=edCommand_Substitute_Arg_Flag,edCommand_Substitute_Arg_Count
+ \ contains=edCommand_Substitute_Arg_Replacement_Escape,
+ \ edCommand_Substitute_Arg_Replacement_Newline,
+ \ edCommand_Substitute_Arg_Replacement_Match
+
+syn region edCommand_Substitute_Arg_Replacement contained
+ \ matchgroup=Delimiter
+ \ start=/\z(.\)%\@=/
+ \ end=/\%(\z1%\)\@<=\%(\z1\|$\)/
+ \ nextgroup=edCommand_Substitute_Arg_Flag,edCommand_Substitute_Arg_Count
+ \ contains=edCommand_Substitute_Arg_Replacement_Repeat
+ \ oneline
+
+syn match edCommand_Substitute_Arg_Replacement_Escape contained /\./
+syn match edCommand_Substitute_Arg_Replacement_Newline contained /\$/
+syn match edCommand_Substitute_Arg_Replacement_Match contained /&/
+syn match edCommand_Substitute_Arg_Replacement_Repeat contained /%/
+
+syn match edCommand_Substitute_Arg_Flag contained
+ \ /g/
+ \ nextgroup=edCommand_Substitute_Arg_Flag,edCommand_Substitute_Arg_Count
+" GNU extension
+syn match edCommand_Substitute_Arg_Flag contained
+ \ /[iI]/
+ \ nextgroup=edCommand_Substitute_Arg_Flag,edCommand_Substitute_Arg_Count
+
+syn match edCommand_Substitute_Arg_Count contained
+ \ /\d\+/
+ \ nextgroup=edCommand_Substitute_Arg_Flag
+
+syn match edCommand_Substitute_Arg_Flag contained
+ \ /[lnp]/
+ \ skipnl
+ \ nextgroup=edCommand_Substitute_Arg_Flag,edCommand_Substitute_Arg_Count
+
+" repeat last s command
+" BSD/GNU extension
+
+syn match edCommand_Substitute contained
+ \ /s\%(\%([gpr]\|\d\+\)\{1,4}\&\%(.*\([gpr]\).* \)\@!\&\%(.*\d\D\+\d\)\@!.*\)\>/
+ \ contains=edCommand_Substitute_Arg_Flag,edCommand_Substitute_Arg_Count
+
+syn match edCommand_Substitute_Arg_Flag contained
+ \ /r/
+ \ nextgroup=edCommand_Substitute_Arg_Flag,edCommand_Substitute_Arg_Count
+
+" Copy Command {{{2
+syn match edCommand_Copy contained
+ \ /t/
+ "\ GNU extension
+ \ skipwhite
+ \ nextgroup=@edAddress,edAddressSeparator,@edCommandPrint
+
+" TODO: maybe implement as a region so that the command list is contained?
+" Global Not-Matched Command {{{2
+syn match edCommand_GlobalNotMatched contained
+ \ /v/
+ \ nextgroup=edCommand_GlobalNotMatched_Arg_Regexp
+syn region edCommand_GlobalNotMatched_Arg_Regexp contained
+ \ matchgroup=Delimiter
+ \ start=/\z([^\
]\)/
+ \ end=/\z1\|$/
+ \ skipwhite
+ \ nextgroup=@edAddress,
+ \ edAddressSeparator,
+ \ @edCommand,
+ \ edCommand_GlobalNotMatched_Arg_Regexp_Flag
+ \ contains=edRegex_EscapeSequence,edRegex_BracketExpression
+
+" GNU extension
+syn match edCommand_GlobalNotMatched_Arg_Regexp_Flag contained
+ \ /[^\
]\@1<=I/
+ \ skipwhite
+ \ nextgroup=@edAddress,edAddressSeparator,@edCommand
+
+" Interactive Global Not-Matched Command {{{2
+syn match edCommand_InteractiveGlobalNotMatched contained
+ \ /V/
+ \ nextgroup=edCommand_InteractiveGlobalNotMatched_Arg_Regexp
+syn region edCommand_InteractiveGlobalNotMatched_Arg_Regexp contained
+ \ matchgroup=Delimiter
+ \ start=/\z([^\
]\)/
+ \ end=/\z1\|$/
+ \ nextgroup=edCommand_InteractiveGlobalNotMatched_Arg_Regexp_Flag
+ \ contains=edRegex_EscapeSequence,edRegex_BracketExpression
+
+" GNU extension
+syn match edCommand_InteractiveGlobalNotMatched_Arg_Regexp_Flag contained
+ \ /[^\
]\@1<=I/
+
+" Write Command {{{2
+syn match edCommand_Write contained
+ \ /w\>/
+ \ skipwhite
+ \ nextgroup=edArg_File,edCommand_ShellEscape
+
+" Write Append Command {{{2
+" BSD/GNU extension
+syn match edCommand_WriteAppend contained
+ \ /W\>/
+ \ skipwhite
+ \ nextgroup=edArg_File,edCommand_ShellEscape
+
+" Write Quit Command {{{2
+" BSD/GNU extension
+syn match edCommand_WriteQuit contained
+ \ /wq\>/
+ \ skipwhite
+ \ nextgroup=edArg_File,edCommand_ShellEscape
+
+" Paste Cut Buffer Command {{{2
+" GNU extension
+syn match edCommand_Paste contained
+ \ /x/
+ \ nextgroup=@edCommandPrint
+
+" Yank Cut Buffer Command {{{2
+" GNU extension
+syn match edCommand_Yank contained
+ \ /y/
+ \ nextgroup=@edCommandPrint
+
+" Scroll Command {{{2
+" BSD/GNU extension
+syn match edCommand_Scroll contained
+ \ /z/
+ \ nextgroup=edCommand_Scroll_Arg_Count,@edCommandPrint
+syn match edCommand_Scroll_Arg_Count contained
+ \ /\d\+/
+ \ nextgroup=@edCommandPrint
+
+" Line Number Command {{{2
+syn match edCommand_LineNumber contained
+ \ /=/
+ \ nextgroup=@edCommandPrint
+" }}}
+
+" no address prefix commands
+
+" Edit Command {{{2
+syn match edCommand_Edit contained
+ \ /\<e\>/
+ \ skipwhite
+ \ nextgroup=edArg_File,edCommand_ShellEscape
+
+" Edit Without Checking Command {{{2
+syn match edCommand_EditWithoutChecking contained
+ \ /\<E\>/
+ \ skipwhite
+ \ nextgroup=edArg_File,edCommand_ShellEscape
+
+" Filename Command {{{2
+syn match edCommand_Filename contained
+ \ /\<f\>/
+ \ skipwhite
+ \ nextgroup=edArg_File
+
+" Help Command {{{2
+syn match edCommand_Help contained
+ \ /\<h/
+ \ nextgroup=@edCommandPrint
+
+" Help-Mode Command {{{2
+syn match edCommand_HelpMode contained
+ \ /\<H/
+ \ nextgroup=@edCommandPrint
+
+" Prompt Command {{{2
+syn match edCommand_Prompt contained
+ \ /\<P/
+ \ nextgroup=@edCommandPrint
+
+" Quit Command {{{2
+syn match edCommand_Quit contained
+ \ /\<q\>/
+
+" Quit Without Checking Command {{{2
+syn match edCommand_QuitWithoutChecking contained
+ \ /\<Q\>/
+
+" Undo Command {{{2
+syn match edCommand_Undo contained
+ \ /\<u/
+ \ nextgroup=@edCommandPrint
+
+" Shell Escape Command {{{2
+syn match edCommand_ShellEscape contained
+ \ /!/
+ \ skipwhite
+ \ nextgroup=edCommand_ShellEscape_Arg_Command,
+ \ edCommand_ShellEscape_Arg_Previous
+syn match edCommand_ShellEscape_Arg_Command contained
+ \ /\S.*$/
+ \ contains=edCommand_ShellEscape_Arg_Command_Filename,
+ \ edCommand_ShellEscape_Arg_Command_FilenameEscape,
+ \ edCommand_ShellEscape_Arg_Command_BackslashEscape
+
+syn match edCommand_ShellEscape_Arg_Command_Filename contained
+ \ /%/
+
+syn match edCommand_ShellEscape_Arg_Command_FilenameEscape contained /\%/
+syn match edCommand_ShellEscape_Arg_Command_BackslashEscape contained /\\/
+
+syn match edCommand_ShellEscape_Arg_Previous contained
+ \ /!/
+ \ skipwhite
+ \ nextgroup=edCommand_ShellEscape_Arg_Command
+
+" Comment Command {{{2
+" GNU extension
+syn match edCommand_Comment contained
+ \ /#.*/
+" }}}
+
+syn cluster edCommand contains=edCommand_ \+
+
+" Command Args {{{2
+syn match edArg_File contained /!\@!\S.*$/
+
+" Command Suffixes {{{1
+syn cluster edCommandPrint
+ \ contains=edCommand_List,edCommand_Number,edCommand_Print
+syn cluster edCommandPrint_InputMode
+ \ contains=edCommand_List_InputMode,
+ \ edCommand_Number_InputMode,
+ \ edCommand_Print_InputMode
+
+" Syncing {{{1
+
+syn sync fromstart
+
+" Default Highlighting {{{1
+
+" addresses
+
+hi def link edAddress Constant
+hi def link edAddressModifier_Offset Special
+hi def link edAddressModifier_Count Special
+hi def link edAddress_Pattern_Flag Special
+
+" commands (addresses)
+
+hi def link edCommand Statement
+
+hi def link edCommand_Append Statement
+hi def link edCommand_Change Statement
+hi def link edCommand_Copy Statement
+hi def link edCommand_Delete Statement
+hi def link edCommand_GlobalNotMatched Statement
+hi def link edCommand_Global Statement
+hi def link edCommand_Insert Statement
+hi def link edCommand_InteractiveGlobalNotMatched Statement
+hi def link edCommand_InteractiveGlobal Statement
+hi def link edCommand_Join Statement
+hi def link edCommand_LineNumber Statement
+hi def link edCommand_List Statement
+hi def link edCommand_List_InputMode edCommand_List
+hi def link edCommand_Mark Statement
+hi def link edCommand_Move Statement
+hi def link edCommand_Number Statement
+hi def link edCommand_Number_InputMode edCommand_Number
+hi def link edCommand_Paste Statement
+hi def link edCommand_Print Statement
+hi def link edCommand_Print_InputMode edCommand_Print
+hi def link edCommand_Read Statement
+hi def link edCommand_Repeat Statement
+hi def link edCommand_Scroll Statement
+hi def link edCommand_Substitute Statement
+hi def link edCommand_WriteAppend Statement
+hi def link edCommand_WriteQuit Statement
+hi def link edCommand_Write Statement
+hi def link edCommand_Yank Statement
+
+" commands (no addresses)
+
+hi def link edCommand_Edit Statement
+hi def link edCommand_EditWithoutChecking Statement
+hi def link edCommand_Filename Statement
+hi def link edCommand_HelpMode Statement
+hi def link edCommand_Help Statement
+hi def link edCommand_Prompt Statement
+hi def link edCommand_Quit Statement
+hi def link edCommand_QuitWithoutChecking Statement
+hi def link edCommand_ShellEscape Statement
+hi def link edCommand_Undo Statement
+
+hi def link edCommand_Comment Comment
+
+" command args
+
+hi def link edArg_InputMode_Text Normal
+hi def link edArg_InputMode_Text_Global edArg_InputMode_Text
+hi def link edArg_InputMode_EndMarker edCommand
+
+hi def link edCommand_Mark_Arg_Name Constant
+
+hi def link edCommand_Scroll_Arg_Count Number
+
+hi def link edCommand_ShellEscape_Arg_Command_Filename Special
+hi def link edCommand_ShellEscape_Arg_Command_FilenameEscape Special
+hi def link edCommand_ShellEscape_Arg_Command_BackslashEscape Special
+hi def link edCommand_ShellEscape_Arg_Previous Constant
+
+hi def link edCommand_Substitute_Arg_Replacement_Escape Special
+hi def link edCommand_Substitute_Arg_Replacement_Newline Special
+hi def link edCommand_Substitute_Arg_Replacement_Match Special
+hi def link edCommand_Substitute_Arg_Replacement_Repeat Special
+hi def link edCommand_Substitute_Arg_Flag Special
+hi def link edCommand_Substitute_Arg_Count Special
+
+hi def link edCommand_Global_Arg_Regexp_Flag Special
+hi def link edCommand_InteractiveGlobal_Arg_Regexp_Flag Special
+hi def link edCommand_GlobalNotMatched_Arg_Regexp_Flag Special
+hi def link edCommand_InteractiveGlobalNotMatched_Arg_Regexp_Flag Special
+
+" line continuation
+
+hi def link edLineContinue Delimiter
+hi def link edLineContinue_InputMode edLineContinue
+hi def link edLineContinue_InputMode_Text edLineContinue
+
+
+" }}}
+
+let b:current_syntax = "ed"
+
+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/testdir/dumps/ed_addresses_00.dump b/runtime/syntax/testdir/dumps/ed_addresses_00.dump
new file mode 100644
index 000000000..b319a91d4
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/ed_addresses_00.dump
@@ -0,0 +1,20 @@
+>#+0#0000e05#ffffff0| |e|d|(|1|)| +0#0000000&@67
+|#+0#0000e05&| |V|I|M|_|T|E|S|T|_|S|E|T|U|P| |h|i| |l|i|n|k| |e|d|A|d@1|r|e|s@1|S|e|p|a|r|a|t|o|r| |T|o|d|o| +0#0000000&@26
+@75
+@75
+|#+0#0000e05&| |A|d@1|r|e|s@1|e|s| +0#0000000&@63
+@75
+|.+0#e000002&| +0#0000000&@73
+|$+0#e000002&| +0#0000000&@73
+|4+0#e000002&|2| +0#0000000&@72
+|'+0#e000002&|a| +0#0000000&@72
+|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&| +0#0000000&@69
+|/+0#e000e06&|f+0#0000000&|o@1| @70
+|?+0#e000e06&|f+0#0000000&|o@1|?+0#e000e06&| +0#0000000&@69
+|?+0#e000e06&|f+0#0000000&|o@1| @70
+|++0#e000e06&| +0#0000000&@73
+|-+0#e000e06&| +0#0000000&@73
+|++0#e000e06&|4|2| +0#0000000&@71
+|-+0#e000e06&|4|2| +0#0000000&@71
+@75
+@57|1|,|1| @10|T|o|p|
diff --git a/runtime/syntax/testdir/dumps/ed_addresses_01.dump b/runtime/syntax/testdir/dumps/ed_addresses_01.dump
new file mode 100644
index 000000000..85a682621
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/ed_addresses_01.dump
@@ -0,0 +1,20 @@
+|?+0#e000e06#ffffff0|f+0#0000000&|o@1| @70
+|++0#e000e06&| +0#0000000&@73
+|-+0#e000e06&| +0#0000000&@73
+|++0#e000e06&|4|2| +0#0000000&@71
+|-+0#e000e06&|4|2| +0#0000000&@71
+> @74
+|.+0#e000002&|p+0#af5f00255&| +0#0000000&@72
+|$+0#e000002&|p+0#af5f00255&| +0#0000000&@72
+|4+0#e000002&|2|p+0#af5f00255&| +0#0000000&@71
+|'+0#e000002&|a|p+0#af5f00255&| +0#0000000&@71
+|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|p+0#af5f00255&| +0#0000000&@68
+|?+0#e000e06&|f+0#0000000&|o@1|?+0#e000e06&|p+0#af5f00255&| +0#0000000&@68
+|++0#e000e06&|p+0#af5f00255&| +0#0000000&@72
+|-+0#e000e06&|p+0#af5f00255&| +0#0000000&@72
+|++0#e000e06&|4|2|p+0#af5f00255&| +0#0000000&@70
+|-+0#e000e06&|4|2|p+0#af5f00255&| +0#0000000&@70
+@75
+@75
+|#+0#0000e05&| |p|a|t@1|e|r|n| |d|e|l|i|m|i|t|e|r|s| +0#0000000&@54
+@57|1|9|,|0|-|1| @8|5|%|
diff --git a/runtime/syntax/testdir/dumps/ed_addresses_02.dump b/runtime/syntax/testdir/dumps/ed_addresses_02.dump
new file mode 100644
index 000000000..30ded8bfa
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/ed_addresses_02.dump
@@ -0,0 +1,20 @@
+|#+0#0000e05#ffffff0| |p|a|t@1|e|r|n| |d|e|l|i|m|i|t|e|r|s| +0#0000000&@54
+@75
+|/+0#e000e06&|\+0#0000000&|/|f|o@1|\|/|b|a|r|\|/|/+0#e000e06&| +0#0000000&@60
+|?+0#e000e06&|\+0#0000000&|?|f|o@1|\|?|b|a|r|\|?|?+0#e000e06&| +0#0000000&@60
+|/+0#e000e06&|\+0#0000000&|/|f|o@1|\|/|b|a|r|\|/| @61
+>?+0#e000e06&|\+0#0000000&|?|f|o@1|\|?|b|a|r|\|?| @61
+@75
+|/+0#e000e06&|f+0#0000000&|o@1|[|/|]|b|a|r|/+0#e000e06&| +0#0000000&@63
+|?+0#e000e06&|f+0#0000000&|o@1|[|?|]|b|a|r|?+0#e000e06&| +0#0000000&@63
+|/+0#e000e06&|f+0#0000000&|o@1|[|/|]|b|a|r| @64
+|?+0#e000e06&|f+0#0000000&|o@1|[|?|]|b|a|r| @64
+@75
+@75
+|#+0#0000e05&| |M|o|d|i|f|i|e|r|s| +0#0000000&@63
+@75
+@75
+|#+0#0000e05&| |o|f@1|s|e|t|s| +0#0000000&@65
+@75
+|.+0#e000002&|++0#e000e06&| +0#0000000&@72
+@57|3|7|,|1| @9|1|2|%|
diff --git a/runtime/syntax/testdir/dumps/ed_addresses_03.dump b/runtime/syntax/testdir/dumps/ed_addresses_03.dump
new file mode 100644
index 000000000..69da5fcfa
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/ed_addresses_03.dump
@@ -0,0 +1,20 @@
+|.+0#e000002#ffffff0|++0#e000e06&| +0#0000000&@72
+|.+0#e000002&|-+0#e000e06&| +0#0000000&@72
+|.+0#e000002&|++0#e000e06&|4|2| +0#0000000&@70
+|.+0#e000002&|-+0#e000e06&|4|2| +0#0000000&@70
+|.+0#e000002&|++0#e000e06&|4|2|-|4|2| +0#0000000&@67
+>.+0#e000002&|-+0#e000e06&|4|2|+|4|2| +0#0000000&@67
+|.+0#e000002&|++0#e000e06&|-|4|2| +0#0000000&@69
+|.+0#e000002&|-+0#e000e06&|+|4|2| +0#0000000&@69
+|.+0#e000002&|++0#e000e06&|4|2|-| +0#0000000&@69
+|.+0#e000002&|-+0#e000e06&|4|2|+| +0#0000000&@69
+|.+0#e000002&|4+0#e000e06&|2|+|-| +0#0000000&@69
+|.+0#e000002&|4+0#e000e06&|2|-|+| +0#0000000&@69
+@75
+|$+0#e000002&|++0#e000e06&| +0#0000000&@72
+|$+0#e000002&|-+0#e000e06&| +0#0000000&@72
+|$+0#e000002&|++0#e000e06&|4|2| +0#0000000&@70
+|$+0#e000002&|-+0#e000e06&|4|2| +0#0000000&@70
+|$+0#e000002&|++0#e000e06&|4|2|-|4|2| +0#0000000&@67
+|$+0#e000002&|-+0#e000e06&|4|2|+|4|2| +0#0000000&@67
+@57|5@1|,|1| @9|1|9|%|
diff --git a/runtime/syntax/testdir/dumps/ed_addresses_04.dump b/runtime/syntax/testdir/dumps/ed_addresses_04.dump
new file mode 100644
index 000000000..5df0460c8
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/ed_addresses_04.dump
@@ -0,0 +1,20 @@
+|$+0#e000002#ffffff0|-+0#e000e06&|4|2|+|4|2| +0#0000000&@67
+|$+0#e000002&|++0#e000e06&|-|4|2| +0#0000000&@69
+|$+0#e000002&|-+0#e000e06&|+|4|2| +0#0000000&@69
+|$+0#e000002&|++0#e000e06&|4|2|-| +0#0000000&@69
+|$+0#e000002&|-+0#e000e06&|4|2|+| +0#0000000&@69
+>$+0#e000002&|4+0#e000e06&|2|+|-| +0#0000000&@69
+|$+0#e000002&|4+0#e000e06&|2|-|+| +0#0000000&@69
+@75
+|4+0#e000002&|2|++0#e000e06&| +0#0000000&@71
+|4+0#e000002&|2|-+0#e000e06&| +0#0000000&@71
+|4+0#e000002&|2|++0#e000e06&|4|2| +0#0000000&@69
+|4+0#e000002&|2|-+0#e000e06&|4|2| +0#0000000&@69
+|4+0#e000002&|2|++0#e000e06&|4|2|-|4|2| +0#0000000&@66
+|4+0#e000002&|2|-+0#e000e06&|4|2|+|4|2| +0#0000000&@66
+|4+0#e000002&|2|++0#e000e06&|-|4|2| +0#0000000&@68
+|4+0#e000002&|2|-+0#e000e06&|+|4|2| +0#0000000&@68
+|4+0#e000002&|2|++0#e000e06&|4|2|-| +0#0000000&@68
+|4+0#e000002&|2|-+0#e000e06&|4|2|+| +0#0000000&@68
+|4+0#e000002&|2| +0#0000000&|4+0#e000e06&|2|+|-| +0#0000000&@67
+@57|7|3|,|1| @9|2|6|%|
diff --git a/runtime/syntax/testdir/dumps/ed_addresses_05.dump b/runtime/syntax/testdir/dumps/ed_addresses_05.dump
new file mode 100644
index 000000000..0dc85e759
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/ed_addresses_05.dump
@@ -0,0 +1,20 @@
+|4+0#e000002#ffffff0|2| +0#0000000&|4+0#e000e06&|2|+|-| +0#0000000&@67
+|4+0#e000002&|2| +0#0000000&|4+0#e000e06&|2|-|+| +0#0000000&@67
+@75
+|'+0#e000002&|a|++0#e000e06&| +0#0000000&@71
+|'+0#e000002&|a|-+0#e000e06&| +0#0000000&@71
+>'+0#e000002&|a|++0#e000e06&|4|2| +0#0000000&@69
+|'+0#e000002&|a|-+0#e000e06&|4|2| +0#0000000&@69
+|'+0#e000002&|a|++0#e000e06&|4|2|-|4|2| +0#0000000&@66
+|'+0#e000002&|a|-+0#e000e06&|4|2|+|4|2| +0#0000000&@66
+|'+0#e000002&|a|++0#e000e06&|-|4|2| +0#0000000&@68
+|'+0#e000002&|a|-+0#e000e06&|+|4|2| +0#0000000&@68
+|'+0#e000002&|a|++0#e000e06&|4|2|-| +0#0000000&@68
+|'+0#e000002&|a|-+0#e000e06&|4|2|+| +0#0000000&@68
+|'+0#e000002&|a|4+0#e000e06&|2|+|-| +0#0000000&@68
+|'+0#e000002&|a|4+0#e000e06&|2|-|+| +0#0000000&@68
+@75
+|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|+| +0#0000000&@68
+|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|-| +0#0000000&@68
+|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|+|4|2| +0#0000000&@66
+@57|9|1|,|1| @9|3@1|%|
diff --git a/runtime/syntax/testdir/dumps/ed_addresses_06.dump b/runtime/syntax/testdir/dumps/ed_addresses_06.dump
new file mode 100644
index 000000000..5544a9a66
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/ed_addresses_06.dump
@@ -0,0 +1,20 @@
+|/+0#e000e06#ffffff0|f+0#0000000&|o@1|/+0#e000e06&|+|4|2| +0#0000000&@66
+|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|-|4|2| +0#0000000&@66
+|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|+|4|2|-|4|2| +0#0000000&@63
+|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|-|4|2|+|4|2| +0#0000000&@63
+|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|+|-|4|2| +0#0000000&@65
+>/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|-|+|4|2| +0#0000000&@65
+|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|+|4|2|-| +0#0000000&@65
+|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|-|4|2|+| +0#0000000&@65
+|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|4|2|+|-| +0#0000000&@65
+|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|4|2|-|+| +0#0000000&@65
+@75
+|?+0#e000e06&|f+0#0000000&|o@1|?+0#e000e06&|+| +0#0000000&@68
+|?+0#e000e06&|f+0#0000000&|o@1|?+0#e000e06&|-| +0#0000000&@68
+|?+0#e000e06&|f+0#0000000&|o@1|?+0#e000e06&|+|4|2| +0#0000000&@66
+|?+0#e000e06&|f+0#0000000&|o@1|?+0#e000e06&|-|4|2| +0#0000000&@66
+|?+0#e000e06&|f+0#0000000&|o@1|?+0#e000e06&|+|4|2|-|4|2| +0#0000000&@63
+|?+0#e000e06&|f+0#0000000&|o@1|?+0#e000e06&|-|4|2|+|4|2| +0#0000000&@63
+|?+0#e000e06&|f+0#0000000&|o@1|?+0#e000e06&|+|-|4|2| +0#0000000&@65
+|?+0#e000e06&|f+0#0000000&|o@1|?+0#e000e06&|-|+|4|2| +0#0000000&@65
+@57|1|0|9|,|1| @8|4|0|%|
diff --git a/runtime/syntax/testdir/dumps/ed_addresses_07.dump b/runtime/syntax/testdir/dumps/ed_addresses_07.dump
new file mode 100644
index 000000000..6baee89ba
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/ed_addresses_07.dump
@@ -0,0 +1,20 @@
+|?+0#e000e06#ffffff0|f+0#0000000&|o@1|?+0#e000e06&|-|+|4|2| +0#0000000&@65
+|?+0#e000e06&|f+0#0000000&|o@1|?+0#e000e06&|+|4|2|-| +0#0000000&@65
+|?+0#e000e06&|f+0#0000000&|o@1|?+0#e000e06&|-|4|2|+| +0#0000000&@65
+|?+0#e000e06&|f+0#0000000&|o@1|?+0#e000e06&|4|2|+|-| +0#0000000&@65
+|?+0#e000e06&|f+0#0000000&|o@1|?+0#e000e06&|4|2|-|+| +0#0000000&@65
+> @74
+|#+0#0000e05&| |c|o|u|n|t|s| +0#0000000&@66
+@75
+|.+0#e000002&|4+0#e000e06&|2| +0#0000000&@71
+|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|4|2| +0#0000000&@67
+|?+0#e000e06&|f+0#0000000&|o@1|?+0#e000e06&|4|2| +0#0000000&@67
+@75
+|#+0#0000e05&| |w|h|i|t|e|s|p|a|c|e| +0#0000000&@62
+@75
+|.+0#e000002&| +0#0000000&|-+0#e000e06&| |+| |-|4|2| +0#0000000&|++0#e000e06&|4|2| +0#0000000&|4+0#e000e06&|2| +0#0000000&|4+0#e000e06&|2| +0#0000000&|-+0#e000e06&| |4|2| +0#0000000&|++0#e000e06&| |4|2| +0#0000000&@45
+@75
+@75
+|#+0#0000e05&| |R|a|n|g|e|s| +0#0000000&@66
+@75
+@57|1|2|7|,|0|-|1| @6|4|7|%|
diff --git a/runtime/syntax/testdir/dumps/ed_addresses_08.dump b/runtime/syntax/testdir/dumps/ed_addresses_08.dump
new file mode 100644
index 000000000..5ce19ca6b
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/ed_addresses_08.dump
@@ -0,0 +1,20 @@
+| +0&#ffffff0@74
+|,+0#0000001#ffff4012| +0#0000000#ffffff0@73
+|;+0#0000001#ffff4012| +0#0000000#ffffff0@73
+@75
+|,+0#0000001#ffff4012@1| +0#0000000#ffffff0@72
+>;+0#0000001#ffff4012@1| +0#0000000#ffffff0@72
+|,+0#0000001#ffff4012|;| +0#0000000#ffffff0@72
+|;+0#0000001#ffff4012|,| +0#0000000#ffffff0@72
+@75
+|,+0#0000001#ffff4012|.+0#e000002#ffffff0| +0#0000000&@72
+|,+0#0000001#ffff4012|$+0#e000002#ffffff0| +0#0000000&@72
+|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&@71
+|,+0#0000001#ffff4012|'+0#e000002#ffffff0|a| +0#0000000&@71
+|,+0#0000001#ffff4012|/+0#e000e06#ffffff0|f+0#0000000&|o@1|/+0#e000e06&| +0#0000000&@68
+|,+0#0000001#ffff4012|/+0#e000e06#ffffff0|f+0#0000000&|o@1| @69
+|,+0#0000001#ffff4012|?+0#e000e06#ffffff0|f+0#0000000&|o@1|?+0#e000e06&| +0#0000000&@68
+|,+0#0000001#ffff4012|?+0#e000e06#ffffff0|f+0#0000000&|o@1| @69
+|,+0#0000001#ffff4012|++0#e000e06#ffffff0| +0#0000000&@72
+|,+0#0000001#ffff4012|-+0#e000e06#ffffff0| +0#0000000&@72
+@57|1|4|5|,|1| @8|5|4|%|
diff --git a/runtime/syntax/testdir/dumps/ed_addresses_09.dump b/runtime/syntax/testdir/dumps/ed_addresses_09.dump
new file mode 100644
index 000000000..419467a93
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/ed_addresses_09.dump
@@ -0,0 +1,20 @@
+|,+0#0000001#ffff4012|-+0#e000e06#ffffff0| +0#0000000&@72
+|,+0#0000001#ffff4012|++0#e000e06#ffffff0|4|2| +0#0000000&@70
+|,+0#0000001#ffff4012|-+0#e000e06#ffffff0|4|2| +0#0000000&@70
+@75
+|;+0#0000001#ffff4012|.+0#e000002#ffffff0| +0#0000000&@72
+>;+0#0000001#ffff4012|$+0#e000002#ffffff0| +0#0000000&@72
+|;+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&@71
+|;+0#0000001#ffff4012|'+0#e000002#ffffff0|a| +0#0000000&@71
+|;+0#0000001#ffff4012|/+0#e000e06#ffffff0|f+0#0000000&|o@1|/+0#e000e06&| +0#0000000&@68
+|;+0#0000001#ffff4012|/+0#e000e06#ffffff0|f+0#0000000&|o@1| @69
+|;+0#0000001#ffff4012|?+0#e000e06#ffffff0|f+0#0000000&|o@1|?+0#e000e06&| +0#0000000&@68
+|;+0#0000001#ffff4012|?+0#e000e06#ffffff0|f+0#0000000&|o@1| @69
+|;+0#0000001#ffff4012|++0#e000e06#ffffff0| +0#0000000&@72
+|;+0#0000001#ffff4012|-+0#e000e06#ffffff0| +0#0000000&@72
+|;+0#0000001#ffff4012|++0#e000e06#ffffff0|4|2| +0#0000000&@70
+|;+0#0000001#ffff4012|-+0#e000e06#ffffff0|4|2| +0#0000000&@70
+@75
+|.+0#e000002&|,+0#0000001#ffff4012| +0#0000000#ffffff0@72
+|$+0#e000002&|,+0#0000001#ffff4012| +0#0000000#ffffff0@72
+@57|1|6|3|,|1| @8|6|1|%|
diff --git a/runtime/syntax/testdir/dumps/ed_addresses_10.dump b/runtime/syntax/testdir/dumps/ed_addresses_10.dump
new file mode 100644
index 000000000..ddc9d9c17
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/ed_addresses_10.dump
@@ -0,0 +1,20 @@
+|$+0#e000002#ffffff0|,+0#0000001#ffff4012| +0#0000000#ffffff0@72
+|4+0#e000002&|2|,+0#0000001#ffff4012| +0#0000000#ffffff0@71
+|'+0#e000002&|a|,+0#0000001#ffff4012| +0#0000000#ffffff0@71
+|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|,+0#0000001#ffff4012| +0#0000000#ffffff0@68
+|?+0#e000e06&|f+0#0000000&|o@1|?+0#e000e06&|,+0#0000001#ffff4012| +0#0000000#ffffff0@68
+>++0#e000e06&|,+0#0000001#ffff4012| +0#0000000#ffffff0@72
+|-+0#e000e06&|,+0#0000001#ffff4012| +0#0000000#ffffff0@72
+|++0#e000e06&|4|2|,+0#0000001#ffff4012| +0#0000000#ffffff0@70
+|-+0#e000e06&|4|2|,+0#0000001#ffff4012| +0#0000000#ffffff0@70
+@75
+|.+0#e000002&|;+0#0000001#ffff4012| +0#0000000#ffffff0@72
+|$+0#e000002&|;+0#0000001#ffff4012| +0#0000000#ffffff0@72
+|4+0#e000002&|2|;+0#0000001#ffff4012| +0#0000000#ffffff0@71
+|'+0#e000002&|a|;+0#0000001#ffff4012| +0#0000000#ffffff0@71
+|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|;+0#0000001#ffff4012| +0#0000000#ffffff0@68
+|?+0#e000e06&|f+0#0000000&|o@1|?+0#e000e06&|;+0#0000001#ffff4012| +0#0000000#ffffff0@68
+|++0#e000e06&|;+0#0000001#ffff4012| +0#0000000#ffffff0@72
+|-+0#e000e06&|;+0#0000001#ffff4012| +0#0000000#ffffff0@72
+|++0#e000e06&|4|2|;+0#0000001#ffff4012| +0#0000000#ffffff0@70
+@57|1|8|1|,|1| @8|6|8|%|
diff --git a/runtime/syntax/testdir/dumps/ed_addresses_11.dump b/runtime/syntax/testdir/dumps/ed_addresses_11.dump
new file mode 100644
index 000000000..dc2828221
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/ed_addresses_11.dump
@@ -0,0 +1,20 @@
+|++0#e000e06#ffffff0|4|2|;+0#0000001#ffff4012| +0#0000000#ffffff0@70
+|-+0#e000e06&|4|2|;+0#0000001#ffff4012| +0#0000000#ffffff0@70
+@75
+|.+0#e000002&|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&@70
+|$+0#e000002&|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&@70
+>4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&@69
+|'+0#e000002&|a|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&@69
+|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&@66
+|?+0#e000e06&|f+0#0000000&|o@1|?+0#e000e06&|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&@66
+|++0#e000e06&|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&@70
+|-+0#e000e06&|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&@70
+|++0#e000e06&|4|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&@68
+|-+0#e000e06&|4|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&@68
+@75
+|4+0#e000002&|2|,+0#0000001#ffff4012|.+0#e000002#ffffff0| +0#0000000&@70
+|4+0#e000002&|2|,+0#0000001#ffff4012|$+0#e000002#ffffff0| +0#0000000&@70
+|4+0#e000002&|2|,+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&@69
+|4+0#e000002&|2|,+0#0000001#ffff4012|'+0#e000002#ffffff0|a| +0#0000000&@69
+|4+0#e000002&|2|,+0#0000001#ffff4012|/+0#e000e06#ffffff0|f+0#0000000&|o@1|/+0#e000e06&| +0#0000000&@66
+@57|1|9@1|,|1| @8|7|5|%|
diff --git a/runtime/syntax/testdir/dumps/ed_addresses_12.dump b/runtime/syntax/testdir/dumps/ed_addresses_12.dump
new file mode 100644
index 000000000..92011c70f
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/ed_addresses_12.dump
@@ -0,0 +1,20 @@
+|4+0#e000002#ffffff0|2|,+0#0000001#ffff4012|/+0#e000e06#ffffff0|f+0#0000000&|o@1|/+0#e000e06&| +0#0000000&@66
+|4+0#e000002&|2|,+0#0000001#ffff4012|/+0#e000e06#ffffff0|f+0#0000000&|o@1| @67
+|4+0#e000002&|2|,+0#0000001#ffff4012|?+0#e000e06#ffffff0|f+0#0000000&|o@1|?+0#e000e06&| +0#0000000&@66
+|4+0#e000002&|2|,+0#0000001#ffff4012|?+0#e000e06#ffffff0|f+0#0000000&|o@1| @67
+|4+0#e000002&|2|,+0#0000001#ffff4012|++0#e000e06#ffffff0| +0#0000000&@70
+>4+0#e000002&|2|,+0#0000001#ffff4012|-+0#e000e06#ffffff0| +0#0000000&@70
+|4+0#e000002&|2|,+0#0000001#ffff4012|++0#e000e06#ffffff0|4|2| +0#0000000&@68
+|4+0#e000002&|2|,+0#0000001#ffff4012|-+0#e000e06#ffffff0|4|2| +0#0000000&@68
+@75
+|.+0#e000002&|;+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&@70
+|$+0#e000002&|;+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&@70
+|4+0#e000002&|2|;+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&@69
+|'+0#e000002&|a|;+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&@69
+|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|;+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&@66
+|?+0#e000e06&|f+0#0000000&|o@1|?+0#e000e06&|;+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&@66
+|++0#e000e06&|;+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&@70
+|-+0#e000e06&|;+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&@70
+|++0#e000e06&|4|2|;+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&@68
+|-+0#e000e06&|4|2|;+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&@68
+@57|2|1|7|,|1| @8|8|2|%|
diff --git a/runtime/syntax/testdir/dumps/ed_addresses_13.dump b/runtime/syntax/testdir/dumps/ed_addresses_13.dump
new file mode 100644
index 000000000..e37744805
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/ed_addresses_13.dump
@@ -0,0 +1,20 @@
+|-+0#e000e06#ffffff0|4|2|;+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&@68
+@75
+|4+0#e000002&|2|;+0#0000001#ffff4012|.+0#e000002#ffffff0| +0#0000000&@70
+|4+0#e000002&|2|;+0#0000001#ffff4012|$+0#e000002#ffffff0| +0#0000000&@70
+|4+0#e000002&|2|;+0#0000001#ffff4012|4+0#e000002#ffffff0|2| +0#0000000&@69
+>4+0#e000002&|2|;+0#0000001#ffff4012|'+0#e000002#ffffff0|a| +0#0000000&@69
+|4+0#e000002&|2|;+0#0000001#ffff4012|/+0#e000e06#ffffff0|f+0#0000000&|o@1|/+0#e000e06&| +0#0000000&@66
+|4+0#e000002&|2|;+0#0000001#ffff4012|/+0#e000e06#ffffff0|f+0#0000000&|o@1| @67
+|4+0#e000002&|2|;+0#0000001#ffff4012|?+0#e000e06#ffffff0|f+0#0000000&|o@1|?+0#e000e06&| +0#0000000&@66
+|4+0#e000002&|2|;+0#0000001#ffff4012|?+0#e000e06#ffffff0|f+0#0000000&|o@1| @67
+|4+0#e000002&|2|;+0#0000001#ffff4012|++0#e000e06#ffffff0| +0#0000000&@70
+|4+0#e000002&|2|;+0#0000001#ffff4012|-+0#e000e06#ffffff0| +0#0000000&@70
+|4+0#e000002&|2|;+0#0000001#ffff4012|++0#e000e06#ffffff0|4|2| +0#0000000&@68
+|4+0#e000002&|2|;+0#0000001#ffff4012|-+0#e000e06#ffffff0|4|2| +0#0000000&@68
+@75
+@75
+|#+0#0000e05&| |w|h|i|t|e|s|p|a|c|e| +0#0000000&@62
+@75
+|.+0#e000002&| +0#0000000&@4|,+0#0000001#ffff4012| +0#0000000#ffffff0|.+0#e000002&| +0#0000000&@65
+@57|2|3|5|,|1| @8|8|9|%|
diff --git a/runtime/syntax/testdir/dumps/ed_addresses_14.dump b/runtime/syntax/testdir/dumps/ed_addresses_14.dump
new file mode 100644
index 000000000..142f98eea
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/ed_addresses_14.dump
@@ -0,0 +1,20 @@
+|.+0#e000002#ffffff0| +0#0000000&@4|,+0#0000001#ffff4012| +0#0000000#ffffff0|.+0#e000002&| +0#0000000&@65
+|$+0#e000002&| +0#0000000&@4|,+0#0000001#ffff4012| +0#0000000#ffffff0|$+0#e000002&| +0#0000000&@65
+|4+0#e000002&|2| +0#0000000&@3|,+0#0000001#ffff4012| +0#0000000#ffffff0|4+0#e000002&|2| +0#0000000&@64
+|'+0#e000002&|a| +0#0000000&@3|,+0#0000001#ffff4012| +0#0000000#ffffff0|'+0#e000002&|a| +0#0000000&@64
+|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&| +0#0000000&|,+0#0000001#ffff4012| +0#0000000#ffffff0|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&| +0#0000000&@61
+>?+0#e000e06&|f+0#0000000&|o@1|?+0#e000e06&| +0#0000000&|,+0#0000001#ffff4012| +0#0000000#ffffff0|?+0#e000e06&|f+0#0000000&|o@1|?+0#e000e06&| +0#0000000&@61
+|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&| +0#0000000&|,+0#0000001#ffff4012| +0#0000000#ffffff0|/+0#e000e06&|f+0#0000000&|o@1| @62
+|?+0#e000e06&|f+0#0000000&|o@1|?+0#e000e06&| +0#0000000&|,+0#0000001#ffff4012| +0#0000000#ffffff0|?+0#e000e06&|f+0#0000000&|o@1| @62
+|++0#e000e06&| @4|,+0#0000001#ffff4012| +0#0000000#ffffff0|++0#e000e06&| +0#0000000&@65
+|-+0#e000e06&| @4|,+0#0000001#ffff4012| +0#0000000#ffffff0|-+0#e000e06&| +0#0000000&@65
+|++0#e000e06&|4|2| +0#0000000&@2|,+0#0000001#ffff4012| +0#0000000#ffffff0|++0#e000e06&|4|2| +0#0000000&@63
+|-+0#e000e06&|4|2| +0#0000000&@2|,+0#0000001#ffff4012| +0#0000000#ffffff0|-+0#e000e06&|4|2| +0#0000000&@63
+@75
+|.+0#e000002&| +0#0000000&@4|;+0#0000001#ffff4012| +0#0000000#ffffff0|.+0#e000002&| +0#0000000&@65
+|$+0#e000002&| +0#0000000&@4|;+0#0000001#ffff4012| +0#0000000#ffffff0|$+0#e000002&| +0#0000000&@65
+|4+0#e000002&|2| +0#0000000&@3|;+0#0000001#ffff4012| +0#0000000#ffffff0|4+0#e000002&|2| +0#0000000&@64
+|'+0#e000002&|a| +0#0000000&@3|;+0#0000001#ffff4012| +0#0000000#ffffff0|'+0#e000002&|a| +0#0000000&@64
+|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&| +0#0000000&|;+0#0000001#ffff4012| +0#0000000#ffffff0|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&| +0#0000000&@61
+|?+0#e000e06&|f+0#0000000&|o@1|?+0#e000e06&| +0#0000000&|;+0#0000001#ffff4012| +0#0000000#ffffff0|?+0#e000e06&|f+0#0000000&|o@1|?+0#e000e06&| +0#0000000&@61
+@57|2|5|3|,|1| @8|9|6|%|
diff --git a/runtime/syntax/testdir/dumps/ed_addresses_15.dump b/runtime/syntax/testdir/dumps/ed_addresses_15.dump
new file mode 100644
index 000000000..eab6c80cc
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/ed_addresses_15.dump
@@ -0,0 +1,20 @@
+|?+0#e000e06#ffffff0|f+0#0000000&|o@1|?+0#e000e06&| +0#0000000&|;+0#0000001#ffff4012| +0#0000000#ffffff0|?+0#e000e06&|f+0#0000000&|o@1|?+0#e000e06&| +0#0000000&@61
+|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&| +0#0000000&|;+0#0000001#ffff4012| +0#0000000#ffffff0|/+0#e000e06&|f+0#0000000&|o@1| @62
+|?+0#e000e06&|f+0#0000000&|o@1|?+0#e000e06&| +0#0000000&|;+0#0000001#ffff4012| +0#0000000#ffffff0|?+0#e000e06&|f+0#0000000&|o@1| @62
+|++0#e000e06&| @4|;+0#0000001#ffff4012| +0#0000000#ffffff0|++0#e000e06&| +0#0000000&@65
+|-+0#e000e06&| @4|;+0#0000001#ffff4012| +0#0000000#ffffff0|-+0#e000e06&| +0#0000000&@65
+>++0#e000e06&|4|2| +0#0000000&@2|;+0#0000001#ffff4012| +0#0000000#ffffff0|++0#e000e06&|4|2| +0#0000000&@63
+|-+0#e000e06&|4|2| +0#0000000&@2|;+0#0000001#ffff4012| +0#0000000#ffffff0|-+0#e000e06&|4|2| +0#0000000&@63
+@75
+@75
+|~+0#4040ff13&| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+| +0#0000000&@56|2|7|1|,|1| @8|B|o|t|
diff --git a/runtime/syntax/testdir/dumps/ed_commands_00.dump b/runtime/syntax/testdir/dumps/ed_commands_00.dump
new file mode 100644
index 000000000..221f1100c
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/ed_commands_00.dump
@@ -0,0 +1,20 @@
+>#+0#0000e05#ffffff0| |e|d|(|1|)| |c|o|m@1|a|n|d|s| +0#0000000&@58
+@75
+@75
+|#+0#0000e05&| |A|p@1|e|n|d| |C|o|m@1|a|n|d| +0#0000000&@58
+@75
+@75
+|a+0#af5f00255&| +0#0000000&@73
+|.+0#af5f00255&| +0#0000000&@73
+@75
+|a+0#af5f00255&| +0#0000000&@73
+|l|i|n|e| |1| @68
+|.+0#af5f00255&| +0#0000000&@73
+@75
+|a+0#af5f00255&| +0#0000000&@73
+|l|i|n|e| |1| @68
+|l|i|n|e| |2| @68
+|l|i|n|e| |3| @68
+|.+0#af5f00255&| +0#0000000&@73
+@75
+@57|1|,|1| @10|T|o|p|
diff --git a/runtime/syntax/testdir/dumps/ed_commands_01.dump b/runtime/syntax/testdir/dumps/ed_commands_01.dump
new file mode 100644
index 000000000..4c817331a
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/ed_commands_01.dump
@@ -0,0 +1,20 @@
+|a+0#af5f00255#ffffff0| +0#0000000&@73
+|l|i|n|e| |1| @68
+|l|i|n|e| |2| @68
+|l|i|n|e| |3| @68
+|.+0#af5f00255&| +0#0000000&@73
+> @74
+|a+0#af5f00255&|n| +0#0000000&@72
+|l|i|n|e| |1| @68
+|.+0#af5f00255&| +0#0000000&@73
+@75
+|a+0#af5f00255&|l| +0#0000000&@72
+|l|i|n|e| |1| @68
+|.+0#af5f00255&| +0#0000000&@73
+@75
+|a+0#af5f00255&|p| +0#0000000&@72
+|l|i|n|e| |1| @68
+|.+0#af5f00255&| +0#0000000&@73
+@75
+|.+0#e000002&|a+0#af5f00255&| +0#0000000&@72
+@57|1|9|,|0|-|1| @8|1|%|
diff --git a/runtime/syntax/testdir/dumps/ed_commands_02.dump b/runtime/syntax/testdir/dumps/ed_commands_02.dump
new file mode 100644
index 000000000..1eec762f7
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/ed_commands_02.dump
@@ -0,0 +1,20 @@
+|.+0#e000002#ffffff0|a+0#af5f00255&| +0#0000000&@72
+|l|i|n|e| |1| @68
+|.+0#af5f00255&| +0#0000000&@73
+@75
+|#+0#0000e05&| |e|x|t|e|n|s|i|o|n|s| +0#0000000&@62
+> @74
+|a+0#af5f00255&|l|n|p| +0#0000000&@70
+|l|i|n|e| |1| @68
+|.+0#af5f00255&| +0#0000000&@73
+@75
+|#+0#0000e05&| |g|l|o|b|a|l| |s|u|b|c|o|m@1|a|n|d| +0#0000000&@55
+@75
+|g+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|a+0#af5f00255&|\+0#e000e06&| +0#0000000&@66
+|.+0#af5f00255&| +0#0000000&@73
+@75
+|g+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|a+0#af5f00255&|\+0#e000e06&| +0#0000000&@66
+|l|i|n|e| |1| @68
+@75
+|g+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|a+0#af5f00255&|\+0#e000e06&| +0#0000000&@66
+@57|3|7|,|0|-|1| @8|3|%|
diff --git a/runtime/syntax/testdir/dumps/ed_commands_03.dump b/runtime/syntax/testdir/dumps/ed_commands_03.dump
new file mode 100644
index 000000000..961ad63e6
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/ed_commands_03.dump
@@ -0,0 +1,20 @@
+|g+0#af5f00255#ffffff0|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|a+0#af5f00255&|\+0#e000e06&| +0#0000000&@66
+|l|i|n|e| |1|\+0#e000e06&| +0#0000000&@67
+|.+0#e000002&| +0#0000000&@73
+@75
+|g+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|a+0#af5f00255&|\+0#e000e06&| +0#0000000&@66
+>l|i|n|e| |1|\+0#e000e06&| +0#0000000&@67
+|.+0#e000002&|\+0#e000e06&| +0#0000000&@72
+|p+0#af5f00255&| +0#0000000&@73
+@75
+|g+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|a+0#af5f00255&|l|\+0#e000e06&| +0#0000000&@65
+|l|i|n|e| |1|\+0#e000e06&| +0#0000000&@67
+|.+0#e000002&| +0#0000000&@73
+@75
+|#+0#0000e05&| |C|h|a|n|g|e| |C|o|m@1|a|n|d| +0#0000000&@58
+@75
+@75
+|c+0#af5f00255&| +0#0000000&@73
+|.+0#af5f00255&| +0#0000000&@73
+@75
+@57|5@1|,|1| @10|6|%|
diff --git a/runtime/syntax/testdir/dumps/ed_commands_04.dump b/runtime/syntax/testdir/dumps/ed_commands_04.dump
new file mode 100644
index 000000000..d94fb91a1
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/ed_commands_04.dump
@@ -0,0 +1,20 @@
+| +0&#ffffff0@74
+|c+0#af5f00255&| +0#0000000&@73
+|l|i|n|e| |1| @68
+|.+0#af5f00255&| +0#0000000&@73
+@75
+>c+0#af5f00255&| +0#0000000&@73
+|l|i|n|e| |1| @68
+|l|i|n|e| |2| @68
+|l|i|n|e| |3| @68
+|.+0#af5f00255&| +0#0000000&@73
+@75
+|c+0#af5f00255&|n| +0#0000000&@72
+|l|i|n|e| |1| @68
+|.+0#af5f00255&| +0#0000000&@73
+@75
+|c+0#af5f00255&|l| +0#0000000&@72
+|l|i|n|e| |1| @68
+|.+0#af5f00255&| +0#0000000&@73
+@75
+@57|7|3|,|1| @10|8|%|
diff --git a/runtime/syntax/testdir/dumps/ed_commands_05.dump b/runtime/syntax/testdir/dumps/ed_commands_05.dump
new file mode 100644
index 000000000..716a2b23c
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/ed_commands_05.dump
@@ -0,0 +1,20 @@
+| +0&#ffffff0@74
+|c+0#af5f00255&|p| +0#0000000&@72
+|l|i|n|e| |1| @68
+|.+0#af5f00255&| +0#0000000&@73
+@75
+>.+0#e000002&|,+0#0000000&|.+0#e000002&|c+0#af5f00255&| +0#0000000&@70
+|l|i|n|e| |1| @68
+|.+0#af5f00255&| +0#0000000&@73
+@75
+|#+0#0000e05&| |e|x|t|e|n|s|i|o|n|s| +0#0000000&@62
+@75
+|c+0#af5f00255&|l|n|p| +0#0000000&@70
+|l|i|n|e| |1| @68
+|.+0#af5f00255&| +0#0000000&@73
+@75
+|#+0#0000e05&| |g|l|o|b|a|l| |s|u|b|c|o|m@1|a|n|d| +0#0000000&@55
+@75
+|g+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|c+0#af5f00255&|\+0#e000e06&| +0#0000000&@66
+|.+0#af5f00255&| +0#0000000&@73
+@57|9|1|,|1| @9|1|0|%|
diff --git a/runtime/syntax/testdir/dumps/ed_commands_06.dump b/runtime/syntax/testdir/dumps/ed_commands_06.dump
new file mode 100644
index 000000000..892b10151
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/ed_commands_06.dump
@@ -0,0 +1,20 @@
+|.+0#af5f00255#ffffff0| +0#0000000&@73
+@75
+|g+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|c+0#af5f00255&|\+0#e000e06&| +0#0000000&@66
+|l|i|n|e| |1| @68
+@75
+>g+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|c+0#af5f00255&|\+0#e000e06&| +0#0000000&@66
+|l|i|n|e| |1|\+0#e000e06&| +0#0000000&@67
+|.+0#e000002&| +0#0000000&@73
+@75
+|g+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|c+0#af5f00255&|\+0#e000e06&| +0#0000000&@66
+|l|i|n|e| |1|\+0#e000e06&| +0#0000000&@67
+|.+0#e000002&|\+0#e000e06&| +0#0000000&@72
+|p+0#af5f00255&| +0#0000000&@73
+@75
+|g+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|c+0#af5f00255&|l|\+0#e000e06&| +0#0000000&@65
+|l|i|n|e| |1|\+0#e000e06&| +0#0000000&@67
+|.+0#e000002&| +0#0000000&@73
+@75
+@75
+@57|1|0|9|,|1| @8|1|2|%|
diff --git a/runtime/syntax/testdir/dumps/ed_commands_07.dump b/runtime/syntax/testdir/dumps/ed_commands_07.dump
new file mode 100644
index 000000000..2958d9529
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/ed_commands_07.dump
@@ -0,0 +1,20 @@
+| +0&#ffffff0@74
+|#+0#0000e05&| |D|e|l|e|t|e| |C|o|m@1|a|n|d| +0#0000000&@58
+@75
+@75
+|d+0#af5f00255&| +0#0000000&@73
+>.+0#e000002&|,+0#0000000&|.+0#e000002&|d+0#af5f00255&| +0#0000000&@70
+@75
+|d+0#af5f00255&|l| +0#0000000&@72
+|d+0#af5f00255&|n| +0#0000000&@72
+|d+0#af5f00255&|p| +0#0000000&@72
+@75
+|#+0#0000e05&| |e|x|t|e|n|s|i|o|n|s| +0#0000000&@62
+@75
+|d+0#af5f00255&|l|n|p| +0#0000000&@70
+@75
+@75
+|#+0#0000e05&| |E|d|i|t| |C|o|m@1|a|n|d| +0#0000000&@60
+@75
+@75
+@57|1|2|7|,|1| @8|1|5|%|
diff --git a/runtime/syntax/testdir/dumps/ed_commands_08.dump b/runtime/syntax/testdir/dumps/ed_commands_08.dump
new file mode 100644
index 000000000..c0ac47b26
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/ed_commands_08.dump
@@ -0,0 +1,20 @@
+| +0&#ffffff0@74
+|e+0#af5f00255&| +0#0000000&@73
+|e+0#af5f00255&| +0#0000000&|f|i|l|e|n|a|m|e| @64
+@75
+|e+0#af5f00255&| +0#0000000&|!+0#af5f00255&|e+0#0000000&|c|h|o| |I|n|p|u|t| |t|e|x|t| @56
+>e+0#af5f00255&| +0#0000000&|!+0#af5f00255&|!+0#e000002&| +0#0000000&@70
+@75
+@75
+|#+0#0000e05&| |E|d|i|t| |W|i|t|h|o|u|t| |C|h|e|c|k|i|n|g| |C|o|m@1|a|n|d| +0#0000000&@43
+@75
+@75
+|E+0#af5f00255&| +0#0000000&@73
+|E+0#af5f00255&| +0#0000000&|f|i|l|e|n|a|m|e| @64
+@75
+@75
+|#+0#0000e05&| |F|i|l|e|n|a|m|e| |C|o|m@1|a|n|d| +0#0000000&@56
+@75
+@75
+|f+0#af5f00255&| +0#0000000&@73
+@57|1|4|5|,|1| @8|1|7|%|
diff --git a/runtime/syntax/testdir/dumps/ed_commands_09.dump b/runtime/syntax/testdir/dumps/ed_commands_09.dump
new file mode 100644
index 000000000..2a38adaf1
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/ed_commands_09.dump
@@ -0,0 +1,20 @@
+|f+0#af5f00255#ffffff0| +0#0000000&@73
+|f+0#af5f00255&| +0#0000000&|f|i|l|e|n|a|m|e| @64
+@75
+@75
+|#+0#0000e05&| |G|l|o|b|a|l| |C|o|m@1|a|n|d| +0#0000000&@58
+> @74
+@75
+|g+0#af5f00255&|/+0#e000e06&| +0#0000000&@72
+|g+0#af5f00255&|/+0#e000e06&@1| +0#0000000&@71
+|g+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1| @69
+|g+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&| +0#0000000&@68
+@75
+|1+0#e000002&|,+0#0000000&|$+0#e000002&|g+0#af5f00255&|/+0#e000e06&| +0#0000000&@69
+|1+0#e000002&|,+0#0000000&|$+0#e000002&|g+0#af5f00255&|/+0#e000e06&@1| +0#0000000&@68
+|1+0#e000002&|,+0#0000000&|$+0#e000002&|g+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1| @66
+|1+0#e000002&|,+0#0000000&|$+0#e000002&|g+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&| +0#0000000&@65
+@75
+|g+0#af5f00255&|/+0#e000e06&@1|p+0#af5f00255&| +0#0000000&@70
+|g+0#af5f00255&|/+0#e000e06&@1|\| +0#0000000&@70
+@57|1|6|3|,|0|-|1| @6|1|9|%|
diff --git a/runtime/syntax/testdir/dumps/ed_commands_10.dump b/runtime/syntax/testdir/dumps/ed_commands_10.dump
new file mode 100644
index 000000000..bb46632b2
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/ed_commands_10.dump
@@ -0,0 +1,20 @@
+|g+0#af5f00255#ffffff0|/+0#e000e06&@1|\| +0#0000000&@70
+|p+0#af5f00255&| +0#0000000&@73
+@75
+|g+0#af5f00255&|/+0#e000e06&@1|l+0#af5f00255&|\+0#e000e06&| +0#0000000&@69
+|n+0#af5f00255&|\+0#e000e06&| +0#0000000&@72
+>p+0#af5f00255&| +0#0000000&@73
+|g+0#af5f00255&|/+0#e000e06&@1|\| +0#0000000&@70
+|l+0#af5f00255&|\+0#e000e06&| +0#0000000&@72
+|n+0#af5f00255&|\+0#e000e06&| +0#0000000&@72
+|p+0#af5f00255&| +0#0000000&@73
+@75
+|1+0#e000002&|,+0#0000000&|$+0#e000002&|g+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|p+0#af5f00255&| +0#0000000&@64
+|1+0#e000002&|,+0#0000000&|$+0#e000002&|g+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|.+0#e000002&|,+0#0000000&|++0#e000e06&|1|p+0#af5f00255&| +0#0000000&@60
+|1+0#e000002&|,+0#0000000&|$+0#e000002&|g+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|\| +0#0000000&@64
+|.+0#e000002&|,+0#0000000&|++0#e000e06&|1|p+0#af5f00255&| +0#0000000&@69
+@75
+@75
+|#+0#0000e05&| |I|n|t|e|r|a|c|t|i|v|e| |G|l|o|b|a|l| |C|o|m@1|a|n|d| +0#0000000&@46
+@75
+@57|1|8|1|,|1| @8|2|1|%|
diff --git a/runtime/syntax/testdir/dumps/ed_commands_11.dump b/runtime/syntax/testdir/dumps/ed_commands_11.dump
new file mode 100644
index 000000000..c29b6740f
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/ed_commands_11.dump
@@ -0,0 +1,20 @@
+| +0&#ffffff0@74
+@75
+|G+0#af5f00255&|/+0#e000e06&| +0#0000000&@72
+|G+0#af5f00255&|/+0#e000e06&@1| +0#0000000&@71
+|G+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1| @69
+>G+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&| +0#0000000&@68
+@75
+|1+0#e000002&|,+0#0000000&|$+0#e000002&|G+0#af5f00255&|/+0#e000e06&| +0#0000000&@69
+|1+0#e000002&|,+0#0000000&|$+0#e000002&|G+0#af5f00255&|/+0#e000e06&@1| +0#0000000&@68
+|1+0#e000002&|,+0#0000000&|$+0#e000002&|G+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1| @66
+|1+0#e000002&|,+0#0000000&|$+0#e000002&|G+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&| +0#0000000&@65
+@75
+|G+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&| +0#0000000&@68
+|d+0#af5f00255&| +0#0000000&@73
+|&+0#af5f00255&| +0#0000000&@73
+@75
+@75
+|#+0#0000e05&| |H|e|l|p| |C|o|m@1|a|n|d| +0#0000000&@60
+@75
+@57|1|9@1|,|1| @8|2|3|%|
diff --git a/runtime/syntax/testdir/dumps/ed_commands_12.dump b/runtime/syntax/testdir/dumps/ed_commands_12.dump
new file mode 100644
index 000000000..1214b254d
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/ed_commands_12.dump
@@ -0,0 +1,20 @@
+| +0&#ffffff0@74
+|h+0#af5f00255&| +0#0000000&@73
+@75
+|h+0#af5f00255&|l| +0#0000000&@72
+|h+0#af5f00255&|n| +0#0000000&@72
+>h+0#af5f00255&|p| +0#0000000&@72
+@75
+@75
+|#+0#0000e05&| |e|x|t|e|n|s|i|o|n|s| +0#0000000&@62
+@75
+|h+0#af5f00255&|l|n|p| +0#0000000&@70
+@75
+@75
+|#+0#0000e05&| |H|e|l|p| |M|o|d|e| |C|o|m@1|a|n|d| +0#0000000&@55
+@75
+|H+0#af5f00255&| +0#0000000&@73
+@75
+|H+0#af5f00255&|l| +0#0000000&@72
+|H+0#af5f00255&|n| +0#0000000&@72
+@57|2|1|7|,|1| @8|2|6|%|
diff --git a/runtime/syntax/testdir/dumps/ed_commands_13.dump b/runtime/syntax/testdir/dumps/ed_commands_13.dump
new file mode 100644
index 000000000..f913ce5f6
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/ed_commands_13.dump
@@ -0,0 +1,20 @@
+|H+0#af5f00255#ffffff0|n| +0#0000000&@72
+|H+0#af5f00255&|p| +0#0000000&@72
+@75
+|#+0#0000e05&| |e|x|t|e|n|s|i|o|n|s| +0#0000000&@62
+@75
+>H+0#af5f00255&|l|n|p| +0#0000000&@70
+@75
+@75
+|#+0#0000e05&| |I|n|s|e|r|t| |C|o|m@1|a|n|d| +0#0000000&@58
+@75
+@75
+|i+0#af5f00255&| +0#0000000&@73
+|.+0#af5f00255&| +0#0000000&@73
+@75
+|i+0#af5f00255&| +0#0000000&@73
+|l|i|n|e| |1| @68
+|.+0#af5f00255&| +0#0000000&@73
+@75
+|i+0#af5f00255&| +0#0000000&@73
+@57|2|3|5|,|1| @8|2|8|%|
diff --git a/runtime/syntax/testdir/dumps/ed_commands_14.dump b/runtime/syntax/testdir/dumps/ed_commands_14.dump
new file mode 100644
index 000000000..fd78cc80f
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/ed_commands_14.dump
@@ -0,0 +1,20 @@
+|i+0#af5f00255#ffffff0| +0#0000000&@73
+|l|i|n|e| |1| @68
+|l|i|n|e| |2| @68
+|l|i|n|e| |3| @68
+|.+0#af5f00255&| +0#0000000&@73
+> @74
+|i+0#af5f00255&|n| +0#0000000&@72
+|l|i|n|e| |1| @68
+|.+0#af5f00255&| +0#0000000&@73
+@75
+|i+0#af5f00255&|l| +0#0000000&@72
+|l|i|n|e| |1| @68
+|.+0#af5f00255&| +0#0000000&@73
+@75
+|i+0#af5f00255&|p| +0#0000000&@72
+|l|i|n|e| |1| @68
+|.+0#af5f00255&| +0#0000000&@73
+@75
+|.+0#e000002&|i+0#af5f00255&| +0#0000000&@72
+@57|2|5|3|,|0|-|1| @6|3|0|%|
diff --git a/runtime/syntax/testdir/dumps/ed_commands_15.dump b/runtime/syntax/testdir/dumps/ed_commands_15.dump
new file mode 100644
index 000000000..94202461f
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/ed_commands_15.dump
@@ -0,0 +1,20 @@
+|.+0#e000002#ffffff0|i+0#af5f00255&| +0#0000000&@72
+|l|i|n|e| |1| @68
+|.+0#af5f00255&| +0#0000000&@73
+@75
+|#+0#0000e05&| |e|x|t|e|n|s|i|o|n|s| +0#0000000&@62
+> @74
+|i+0#af5f00255&|l|n|p| +0#0000000&@70
+|l|i|n|e| |1| @68
+|.+0#af5f00255&| +0#0000000&@73
+@75
+|#+0#0000e05&| |g|l|o|b|a|l| |s|u|b|c|o|m@1|a|n|d| +0#0000000&@55
+@75
+|g+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|i+0#af5f00255&|\+0#e000e06&| +0#0000000&@66
+|.+0#af5f00255&| +0#0000000&@73
+@75
+|g+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|i+0#af5f00255&|\+0#e000e06&| +0#0000000&@66
+|l|i|n|e| |1| @68
+@75
+|g+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|i+0#af5f00255&|\+0#e000e06&| +0#0000000&@66
+@57|2|7|1|,|0|-|1| @6|3|2|%|
diff --git a/runtime/syntax/testdir/dumps/ed_commands_16.dump b/runtime/syntax/testdir/dumps/ed_commands_16.dump
new file mode 100644
index 000000000..08fd83540
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/ed_commands_16.dump
@@ -0,0 +1,20 @@
+|g+0#af5f00255#ffffff0|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|i+0#af5f00255&|\+0#e000e06&| +0#0000000&@66
+|l|i|n|e| |1|\+0#e000e06&| +0#0000000&@67
+|.+0#e000002&| +0#0000000&@73
+@75
+|g+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|i+0#af5f00255&|\+0#e000e06&| +0#0000000&@66
+>l|i|n|e| |1|\+0#e000e06&| +0#0000000&@67
+|.+0#e000002&|\+0#e000e06&| +0#0000000&@72
+|p+0#af5f00255&| +0#0000000&@73
+@75
+|g+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|i+0#af5f00255&|l|\+0#e000e06&| +0#0000000&@65
+|l|i|n|e| |1|\+0#e000e06&| +0#0000000&@67
+|.+0#e000002&| +0#0000000&@73
+@75
+@75
+|#+0#0000e05&| |J|o|i|n| |C|o|m@1|a|n|d| +0#0000000&@60
+@75
+@75
+|j+0#af5f00255&| +0#0000000&@73
+|.+0#e000002&|,+0#0000000&|.+0#e000002&|++0#e000e06&|1|j+0#af5f00255&| +0#0000000&@68
+@57|2|8|9|,|1| @8|3|5|%|
diff --git a/runtime/syntax/testdir/dumps/ed_commands_17.dump b/runtime/syntax/testdir/dumps/ed_commands_17.dump
new file mode 100644
index 000000000..d5007afc8
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/ed_commands_17.dump
@@ -0,0 +1,20 @@
+|.+0#e000002#ffffff0|,+0#0000000&|.+0#e000002&|++0#e000e06&|1|j+0#af5f00255&| +0#0000000&@68
+@75
+|j+0#af5f00255&|l| +0#0000000&@72
+|j+0#af5f00255&|n| +0#0000000&@72
+|j+0#af5f00255&|p| +0#0000000&@72
+> @74
+|#+0#0000e05&| |e|x|t|e|n|s|i|o|n|s| +0#0000000&@62
+@75
+|j+0#af5f00255&|l|n|p| +0#0000000&@70
+@75
+@75
+|#+0#0000e05&| |M|a|r|k| |C|o|m@1|a|n|d| +0#0000000&@60
+@75
+@75
+|k+0#af5f00255&|a+0#e000002&| +0#0000000&@72
+|.+0#e000002&|k+0#af5f00255&|a+0#e000002&| +0#0000000&@71
+@75
+|k+0#af5f00255&|a+0#e000002&|l+0#af5f00255&| +0#0000000&@71
+|k+0#af5f00255&|a+0#e000002&|n+0#af5f00255&| +0#0000000&@71
+@57|3|0|7|,|0|-|1| @6|3|7|%|
diff --git a/runtime/syntax/testdir/dumps/ed_commands_18.dump b/runtime/syntax/testdir/dumps/ed_commands_18.dump
new file mode 100644
index 000000000..8fdcc486a
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/ed_commands_18.dump
@@ -0,0 +1,20 @@
+|k+0#af5f00255#ffffff0|a+0#e000002&|n+0#af5f00255&| +0#0000000&@71
+|k+0#af5f00255&|a+0#e000002&|p+0#af5f00255&| +0#0000000&@71
+@75
+|#+0#0000e05&| |e|x|t|e|n|s|i|o|n|s| +0#0000000&@62
+@75
+>k+0#af5f00255&|a+0#e000002&|l+0#af5f00255&|n|p| +0#0000000&@69
+@75
+@75
+|#+0#0000e05&| |L|i|s|t| |C|o|m@1|a|n|d| +0#0000000&@60
+@75
+@75
+|l+0#af5f00255&| +0#0000000&@73
+|.+0#e000002&|,+0#0000000&|.+0#e000002&|l+0#af5f00255&| +0#0000000&@70
+@75
+|l+0#af5f00255&@1| +0#0000000&@72
+|l+0#af5f00255&|n| +0#0000000&@72
+|l+0#af5f00255&|p| +0#0000000&@72
+@75
+|#+0#0000e05&| |e|x|t|e|n|s|i|o|n|s| +0#0000000&@62
+@57|3|2|5|,|1| @8|3|9|%|
diff --git a/runtime/syntax/testdir/dumps/ed_commands_19.dump b/runtime/syntax/testdir/dumps/ed_commands_19.dump
new file mode 100644
index 000000000..d9ba8fef7
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/ed_commands_19.dump
@@ -0,0 +1,20 @@
+|#+0#0000e05#ffffff0| |e|x|t|e|n|s|i|o|n|s| +0#0000000&@62
+@75
+|l+0#af5f00255&@1|n|p| +0#0000000&@70
+@75
+@75
+>#+0#0000e05&| |M|o|v|e| |C|o|m@1|a|n|d| +0#0000000&@60
+@75
+@75
+|m+0#af5f00255&|$+0#e000002&| +0#0000000&@72
+|.+0#e000002&|,+0#0000000&|.+0#e000002&|m+0#af5f00255&|$+0#e000002&| +0#0000000&@69
+@75
+|m+0#af5f00255&|/+0#e000e06&|p+0#0000000&|a|t@1|e|r|n|/+0#e000e06&| +0#0000000&@64
+|.+0#e000002&|,+0#0000000&|.+0#e000002&|m+0#af5f00255&|/+0#e000e06&|p+0#0000000&|a|t@1|e|r|n|/+0#e000e06&| +0#0000000&@61
+@75
+|m+0#af5f00255&|l| +0#0000000&@72
+|m+0#af5f00255&|n| +0#0000000&@72
+|m+0#af5f00255&|p| +0#0000000&@72
+@75
+|m+0#af5f00255&|$+0#e000002&|l+0#af5f00255&| +0#0000000&@71
+@57|3|4|3|,|1| @8|4|1|%|
diff --git a/runtime/syntax/testdir/dumps/ed_commands_20.dump b/runtime/syntax/testdir/dumps/ed_commands_20.dump
new file mode 100644
index 000000000..2550a648c
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/ed_commands_20.dump
@@ -0,0 +1,20 @@
+|m+0#af5f00255#ffffff0|$+0#e000002&|l+0#af5f00255&| +0#0000000&@71
+|m+0#af5f00255&|$+0#e000002&|n+0#af5f00255&| +0#0000000&@71
+|m+0#af5f00255&|$+0#e000002&|p+0#af5f00255&| +0#0000000&@71
+@75
+|m+0#af5f00255&|/+0#e000e06&|p+0#0000000&|a|t@1|e|r|n|/+0#e000e06&|l+0#af5f00255&| +0#0000000&@63
+>m+0#af5f00255&|/+0#e000e06&|p+0#0000000&|a|t@1|e|r|n|/+0#e000e06&|n+0#af5f00255&| +0#0000000&@63
+|m+0#af5f00255&|/+0#e000e06&|p+0#0000000&|a|t@1|e|r|n|/+0#e000e06&|p+0#af5f00255&| +0#0000000&@63
+@75
+|#+0#0000e05&| |e|x|t|e|n|s|i|o|n|s| +0#0000000&@62
+@75
+|m+0#af5f00255&|l|n|p| +0#0000000&@70
+|m+0#af5f00255&|$+0#e000002&|l+0#af5f00255&|n|p| +0#0000000&@69
+|m+0#af5f00255&|/+0#e000e06&|p+0#0000000&|a|t@1|e|r|n|/+0#e000e06&|l+0#af5f00255&|n|p| +0#0000000&@61
+@75
+@75
+|#+0#0000e05&| |N|u|m|b|e|r| |C|o|m@1|a|n|d| +0#0000000&@58
+@75
+@75
+|n+0#af5f00255&| +0#0000000&@73
+@57|3|6|1|,|1| @8|4@1|%|
diff --git a/runtime/syntax/testdir/dumps/ed_commands_21.dump b/runtime/syntax/testdir/dumps/ed_commands_21.dump
new file mode 100644
index 000000000..89c28320f
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/ed_commands_21.dump
@@ -0,0 +1,20 @@
+|n+0#af5f00255#ffffff0| +0#0000000&@73
+|.+0#e000002&|,+0#0000000&|.+0#e000002&|n+0#af5f00255&| +0#0000000&@70
+@75
+|n+0#af5f00255&|l| +0#0000000&@72
+|n+0#af5f00255&@1| +0#0000000&@72
+>n+0#af5f00255&|p| +0#0000000&@72
+@75
+|#+0#0000e05&| |e|x|t|e|n|s|i|o|n|s| +0#0000000&@62
+@75
+|n+0#af5f00255&|l|n|p| +0#0000000&@70
+@75
+@75
+|#+0#0000e05&| |P|r|i|n|t| |C|o|m@1|a|n|d| +0#0000000&@59
+@75
+@75
+|p+0#af5f00255&| +0#0000000&@73
+|.+0#e000002&|,+0#0000000&|.+0#e000002&|p+0#af5f00255&| +0#0000000&@70
+@75
+|p+0#af5f00255&|l| +0#0000000&@72
+@57|3|7|9|,|1| @8|4|6|%|
diff --git a/runtime/syntax/testdir/dumps/ed_commands_22.dump b/runtime/syntax/testdir/dumps/ed_commands_22.dump
new file mode 100644
index 000000000..ab363773d
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/ed_commands_22.dump
@@ -0,0 +1,20 @@
+|p+0#af5f00255#ffffff0|l| +0#0000000&@72
+|p+0#af5f00255&|n| +0#0000000&@72
+|p+0#af5f00255&@1| +0#0000000&@72
+@75
+|#+0#0000e05&| |e|x|t|e|n|s|i|o|n|s| +0#0000000&@62
+> @74
+|p+0#af5f00255&|l|n|p| +0#0000000&@70
+@75
+@75
+|#+0#0000e05&| |P|r|o|m|p|t| |C|o|m@1|a|n|d| +0#0000000&@58
+@75
+@75
+|P+0#af5f00255&| +0#0000000&@73
+@75
+|P+0#af5f00255&|l| +0#0000000&@72
+|P+0#af5f00255&|n| +0#0000000&@72
+|P+0#af5f00255&|p| +0#0000000&@72
+@75
+|#+0#0000e05&| |e|x|t|e|n|s|i|o|n|s| +0#0000000&@62
+@57|3|9|7|,|0|-|1| @6|4|8|%|
diff --git a/runtime/syntax/testdir/dumps/ed_commands_23.dump b/runtime/syntax/testdir/dumps/ed_commands_23.dump
new file mode 100644
index 000000000..0af8cb669
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/ed_commands_23.dump
@@ -0,0 +1,20 @@
+|#+0#0000e05#ffffff0| |e|x|t|e|n|s|i|o|n|s| +0#0000000&@62
+@75
+|P+0#af5f00255&|l|n|p| +0#0000000&@70
+@75
+@75
+>#+0#0000e05&| |Q|u|i|t| |C|o|m@1|a|n|d| +0#0000000&@60
+@75
+@75
+|q+0#af5f00255&| +0#0000000&@73
+@75
+@75
+|#+0#0000e05&| |Q|u|i|t| |W|i|t|h|o|u|t| |C|h|e|c|k|i|n|g| |C|o|m@1|a|n|d| +0#0000000&@43
+@75
+|Q+0#af5f00255&| +0#0000000&@73
+@75
+@75
+|#+0#0000e05&| |R|e|a|d| |C|o|m@1|a|n|d| +0#0000000&@60
+@75
+|r+0#af5f00255&| +0#0000000&@73
+@57|4|1|5|,|1| @8|5|0|%|
diff --git a/runtime/syntax/testdir/dumps/ed_commands_24.dump b/runtime/syntax/testdir/dumps/ed_commands_24.dump
new file mode 100644
index 000000000..34560f697
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/ed_commands_24.dump
@@ -0,0 +1,20 @@
+|r+0#af5f00255#ffffff0| +0#0000000&@73
+|r+0#af5f00255&| +0#0000000&|f|i|l|e|n|a|m|e| @64
+|$+0#e000002&|r+0#af5f00255&| +0#0000000&@72
+|$+0#e000002&|r+0#af5f00255&| +0#0000000&|f|i|l|e|n|a|m|e| @63
+@75
+>r+0#af5f00255&| +0#0000000&|!+0#af5f00255&|e+0#0000000&|c|h|o| |I|n|p|u|t| |t|e|x|t| @56
+|r+0#af5f00255&| +0#0000000&|!+0#af5f00255&|!+0#e000002&| +0#0000000&@70
+@75
+@75
+|#+0#0000e05&| |S|u|b|s|t|i|t|u|t|e| |C|o|m@1|a|n|d| +0#0000000&@54
+@75
+@75
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&| +0#0000000&@64
+|.+0#e000002&|,+0#0000000&|.+0#e000002&|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&| +0#0000000&@61
+@75
+|s+0#af5f00255&|/+0#e000e06&@1|b+0#0000000&|a|r| @68
+@75
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|b|a|z| @62
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|\+0#e000e06&| +0#0000000&@64
+@57|4|3@1|,|1| @8|5|3|%|
diff --git a/runtime/syntax/testdir/dumps/ed_commands_25.dump b/runtime/syntax/testdir/dumps/ed_commands_25.dump
new file mode 100644
index 000000000..6de5a8d2e
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/ed_commands_25.dump
@@ -0,0 +1,20 @@
+|s+0#af5f00255#ffffff0|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|\+0#e000e06&| +0#0000000&@64
+|b|a|z| @71
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|\+0#e000e06&| +0#0000000&@64
+|b|a|z|/+0#e000e06&| +0#0000000&@70
+@75
+>s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|&+0#e000e06&|b+0#0000000&|a|z| @61
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|&+0#e000e06&|\| +0#0000000&@63
+|b|a|z| @71
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|&+0#e000e06&|\| +0#0000000&@63
+|b|a|z|/+0#e000e06&| +0#0000000&@70
+@75
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|%| +0#0000000&@67
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|%|/| +0#0000000&@66
+@75
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|\|%| +0#0000000&@66
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|\|%|/| +0#0000000&@65
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|%+0#0000000&@1| @66
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|%+0#0000000&@1|/+0#e000e06&| +0#0000000&@65
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|%+0#0000000&|a| @66
+@57|4|5|1|,|1| @8|5@1|%|
diff --git a/runtime/syntax/testdir/dumps/ed_commands_26.dump b/runtime/syntax/testdir/dumps/ed_commands_26.dump
new file mode 100644
index 000000000..eb0abdab1
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/ed_commands_26.dump
@@ -0,0 +1,20 @@
+|s+0#af5f00255#ffffff0|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|%+0#0000000&|a| @66
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|%+0#0000000&|a|/+0#e000e06&| +0#0000000&@65
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|a+0#0000000&|%| @66
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|a+0#0000000&|%|/+0#e000e06&| +0#0000000&@65
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|%+0#0000000&|a|%| @65
+>s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|%+0#0000000&|a|%|/+0#e000e06&| +0#0000000&@64
+@75
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|\+0#e000e06&|1|b+0#0000000&|a|z|/+0#e000e06&| +0#0000000&@59
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|\+0#e000e06&|2|b+0#0000000&|a|z|/+0#e000e06&| +0#0000000&@59
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|\+0#e000e06&|3|b+0#0000000&|a|z|/+0#e000e06&| +0#0000000&@59
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|\+0#e000e06&|4|b+0#0000000&|a|z|/+0#e000e06&| +0#0000000&@59
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|\+0#e000e06&|5|b+0#0000000&|a|z|/+0#e000e06&| +0#0000000&@59
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|\+0#e000e06&|6|b+0#0000000&|a|z|/+0#e000e06&| +0#0000000&@59
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|\+0#e000e06&|7|b+0#0000000&|a|z|/+0#e000e06&| +0#0000000&@59
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|\+0#e000e06&|8|b+0#0000000&|a|z|/+0#e000e06&| +0#0000000&@59
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|\+0#e000e06&|9|b+0#0000000&|a|z|/+0#e000e06&| +0#0000000&@59
+@75
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|\+0#e000e06&|1|0+0#0000000&|b|a|z|/+0#e000e06&| +0#0000000&@58
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|\+0#e000e06&|1|1+0#0000000&|b|a|z|/+0#e000e06&| +0#0000000&@58
+@57|4|6|9|,|1| @8|5|7|%|
diff --git a/runtime/syntax/testdir/dumps/ed_commands_27.dump b/runtime/syntax/testdir/dumps/ed_commands_27.dump
new file mode 100644
index 000000000..3d6656c14
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/ed_commands_27.dump
@@ -0,0 +1,20 @@
+|s+0#af5f00255#ffffff0|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|\+0#e000e06&|1|1+0#0000000&|b|a|z|/+0#e000e06&| +0#0000000&@58
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|\+0#e000e06&|1|2+0#0000000&|b|a|z|/+0#e000e06&| +0#0000000&@58
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|\+0#e000e06&|1|3+0#0000000&|b|a|z|/+0#e000e06&| +0#0000000&@58
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|\+0#e000e06&|1|4+0#0000000&|b|a|z|/+0#e000e06&| +0#0000000&@58
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|\+0#e000e06&|1|5+0#0000000&|b|a|z|/+0#e000e06&| +0#0000000&@58
+>s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|\+0#e000e06&|1|6+0#0000000&|b|a|z|/+0#e000e06&| +0#0000000&@58
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|\+0#e000e06&|1|7+0#0000000&|b|a|z|/+0#e000e06&| +0#0000000&@58
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|\+0#e000e06&|1|8+0#0000000&|b|a|z|/+0#e000e06&| +0#0000000&@58
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|\+0#e000e06&|1|9+0#0000000&|b|a|z|/+0#e000e06&| +0#0000000&@58
+@75
+@75
+|#+0#0000e05&| |f|l|a|g|s| +0#0000000&@67
+@75
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|g| +0#0000000&@63
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l| +0#0000000&@63
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n| +0#0000000&@63
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p| +0#0000000&@63
+@75
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|g|l| +0#0000000&@62
+@57|4|8|7|,|1| @8|5|9|%|
diff --git a/runtime/syntax/testdir/dumps/ed_commands_28.dump b/runtime/syntax/testdir/dumps/ed_commands_28.dump
new file mode 100644
index 000000000..55b31f8ea
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/ed_commands_28.dump
@@ -0,0 +1,20 @@
+|s+0#af5f00255#ffffff0|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|g|l| +0#0000000&@62
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|g|n| +0#0000000&@62
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|g|p| +0#0000000&@62
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|g| +0#0000000&@62
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|n| +0#0000000&@62
+>s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|p| +0#0000000&@62
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n|g| +0#0000000&@62
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n|l| +0#0000000&@62
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n|p| +0#0000000&@62
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|g| +0#0000000&@62
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|l| +0#0000000&@62
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|n| +0#0000000&@62
+@75
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|g|l|n| +0#0000000&@61
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|g|l|p| +0#0000000&@61
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|g|n|l| +0#0000000&@61
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|g|n|p| +0#0000000&@61
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|g|p|l| +0#0000000&@61
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|g|p|n| +0#0000000&@61
+@57|5|0|5|,|1| @8|6|1|%|
diff --git a/runtime/syntax/testdir/dumps/ed_commands_29.dump b/runtime/syntax/testdir/dumps/ed_commands_29.dump
new file mode 100644
index 000000000..61aa01214
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/ed_commands_29.dump
@@ -0,0 +1,20 @@
+|s+0#af5f00255#ffffff0|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|g|p|n| +0#0000000&@61
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|g|n| +0#0000000&@61
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|g|p| +0#0000000&@61
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|n|g| +0#0000000&@61
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|n|p| +0#0000000&@61
+>s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|p|g| +0#0000000&@61
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|p|n| +0#0000000&@61
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n|g|l| +0#0000000&@61
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n|g|p| +0#0000000&@61
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n|l|g| +0#0000000&@61
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n|l|p| +0#0000000&@61
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n|p|g| +0#0000000&@61
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n|p|l| +0#0000000&@61
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|g|l| +0#0000000&@61
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|g|n| +0#0000000&@61
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|l|g| +0#0000000&@61
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|l|n| +0#0000000&@61
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|n|g| +0#0000000&@61
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|n|l| +0#0000000&@61
+@57|5|2|3|,|1| @8|6|4|%|
diff --git a/runtime/syntax/testdir/dumps/ed_commands_30.dump b/runtime/syntax/testdir/dumps/ed_commands_30.dump
new file mode 100644
index 000000000..b8cfdfea6
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/ed_commands_30.dump
@@ -0,0 +1,20 @@
+|s+0#af5f00255#ffffff0|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|n|l| +0#0000000&@61
+@75
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|g|l|n|p| +0#0000000&@60
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|g|l|p|n| +0#0000000&@60
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|g|n|l|p| +0#0000000&@60
+>s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|g|n|p|l| +0#0000000&@60
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|g|p|l|n| +0#0000000&@60
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|g|p|n|l| +0#0000000&@60
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|g|n|p| +0#0000000&@60
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|g|p|n| +0#0000000&@60
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|n|g|p| +0#0000000&@60
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|n|p|g| +0#0000000&@60
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|p|g|n| +0#0000000&@60
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|p|n|g| +0#0000000&@60
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n|g|l|p| +0#0000000&@60
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n|g|p|l| +0#0000000&@60
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n|l|g|p| +0#0000000&@60
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n|l|p|g| +0#0000000&@60
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n|p|g|l| +0#0000000&@60
+@57|5|4|1|,|1| @8|6@1|%|
diff --git a/runtime/syntax/testdir/dumps/ed_commands_31.dump b/runtime/syntax/testdir/dumps/ed_commands_31.dump
new file mode 100644
index 000000000..b481c0883
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/ed_commands_31.dump
@@ -0,0 +1,20 @@
+|s+0#af5f00255#ffffff0|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n|p|g|l| +0#0000000&@60
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n|p|l|g| +0#0000000&@60
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|g|l|n| +0#0000000&@60
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|g|n|l| +0#0000000&@60
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|l|g|n| +0#0000000&@60
+>s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|l|n|g| +0#0000000&@60
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|n|g|l| +0#0000000&@60
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|n|l|g| +0#0000000&@60
+@75
+@75
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|3| +0#0000000&@63
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l| +0#0000000&@63
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n| +0#0000000&@63
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p| +0#0000000&@63
+@75
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|3|l| +0#0000000&@62
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|3|n| +0#0000000&@62
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|3|p| +0#0000000&@62
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|3| +0#0000000&@62
+@57|5@1|9|,|1| @8|6|8|%|
diff --git a/runtime/syntax/testdir/dumps/ed_commands_32.dump b/runtime/syntax/testdir/dumps/ed_commands_32.dump
new file mode 100644
index 000000000..1b0696039
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/ed_commands_32.dump
@@ -0,0 +1,20 @@
+|s+0#af5f00255#ffffff0|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|3| +0#0000000&@62
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|n| +0#0000000&@62
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|p| +0#0000000&@62
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n|3| +0#0000000&@62
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n|l| +0#0000000&@62
+>s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n|p| +0#0000000&@62
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|3| +0#0000000&@62
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|l| +0#0000000&@62
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|n| +0#0000000&@62
+@75
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|3|l|n| +0#0000000&@61
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|3|l|p| +0#0000000&@61
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|3|n|l| +0#0000000&@61
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|3|n|p| +0#0000000&@61
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|3|p|l| +0#0000000&@61
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|3|p|n| +0#0000000&@61
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|3|n| +0#0000000&@61
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|3|p| +0#0000000&@61
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|n|3| +0#0000000&@61
+@57|5|7@1|,|1| @8|7|0|%|
diff --git a/runtime/syntax/testdir/dumps/ed_commands_33.dump b/runtime/syntax/testdir/dumps/ed_commands_33.dump
new file mode 100644
index 000000000..99947733a
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/ed_commands_33.dump
@@ -0,0 +1,20 @@
+|s+0#af5f00255#ffffff0|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|n|3| +0#0000000&@61
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|n|p| +0#0000000&@61
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|p|3| +0#0000000&@61
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|p|n| +0#0000000&@61
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n|3|l| +0#0000000&@61
+>s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n|3|p| +0#0000000&@61
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n|l|3| +0#0000000&@61
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n|l|p| +0#0000000&@61
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n|p|3| +0#0000000&@61
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n|p|l| +0#0000000&@61
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|3|l| +0#0000000&@61
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|3|n| +0#0000000&@61
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|l|3| +0#0000000&@61
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|l|n| +0#0000000&@61
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|n|3| +0#0000000&@61
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|n|l| +0#0000000&@61
+@75
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|3|l|n|p| +0#0000000&@60
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|3|l|p|n| +0#0000000&@60
+@57|5|9|5|,|1| @8|7|3|%|
diff --git a/runtime/syntax/testdir/dumps/ed_commands_34.dump b/runtime/syntax/testdir/dumps/ed_commands_34.dump
new file mode 100644
index 000000000..ec720d67a
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/ed_commands_34.dump
@@ -0,0 +1,20 @@
+|s+0#af5f00255#ffffff0|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|3|l|p|n| +0#0000000&@60
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|3|n|l|p| +0#0000000&@60
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|3|n|p|l| +0#0000000&@60
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|3|p|l|n| +0#0000000&@60
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|3|p|n|l| +0#0000000&@60
+>s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|3|n|p| +0#0000000&@60
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|3|p|n| +0#0000000&@60
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|n|3|p| +0#0000000&@60
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|n|p|3| +0#0000000&@60
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|p|3|n| +0#0000000&@60
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|l|p|n|3| +0#0000000&@60
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n|3|l|p| +0#0000000&@60
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n|3|p|l| +0#0000000&@60
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n|l|3|p| +0#0000000&@60
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n|l|p|3| +0#0000000&@60
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n|p|3|l| +0#0000000&@60
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|n|p|l|3| +0#0000000&@60
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|3|l|n| +0#0000000&@60
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|3|n|l| +0#0000000&@60
+@57|6|1|3|,|1| @8|7|5|%|
diff --git a/runtime/syntax/testdir/dumps/ed_commands_35.dump b/runtime/syntax/testdir/dumps/ed_commands_35.dump
new file mode 100644
index 000000000..eeb50e4a5
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/ed_commands_35.dump
@@ -0,0 +1,20 @@
+|s+0#af5f00255#ffffff0|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|3|n|l| +0#0000000&@60
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|l|3|n| +0#0000000&@60
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|l|n|3| +0#0000000&@60
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|n|3|l| +0#0000000&@60
+|s+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&|b+0#0000000&|a|r|/+0#e000e06&|p|n|l|3| +0#0000000&@60
+> @74
+@75
+|#+0#0000e05&| |r|e|p|e|a|t| |l|a|s|t| |s|u|b|s|t|i|t|u|t|e| +0#0000000&@50
+@75
+|s+0#af5f00255&|3+0#e000e06&| +0#0000000&@72
+|s+0#af5f00255&|g+0#e000e06&| +0#0000000&@72
+|s+0#af5f00255&|p+0#e000e06&| +0#0000000&@72
+|s+0#af5f00255&|r+0#e000e06&| +0#0000000&@72
+@75
+|s+0#af5f00255&|3+0#e000e06&|g| +0#0000000&@71
+|s+0#af5f00255&|3+0#e000e06&|p| +0#0000000&@71
+|s+0#af5f00255&|3+0#e000e06&|r| +0#0000000&@71
+|s+0#af5f00255&|g+0#e000e06&|3| +0#0000000&@71
+|s+0#af5f00255&|g+0#e000e06&|p| +0#0000000&@71
+@57|6|3|1|,|0|-|1| @6|7@1|%|
diff --git a/runtime/syntax/testdir/dumps/ed_commands_36.dump b/runtime/syntax/testdir/dumps/ed_commands_36.dump
new file mode 100644
index 000000000..78bfc763e
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/ed_commands_36.dump
@@ -0,0 +1,20 @@
+|s+0#af5f00255#ffffff0|g+0#e000e06&|p| +0#0000000&@71
+|s+0#af5f00255&|g+0#e000e06&|r| +0#0000000&@71
+|s+0#af5f00255&|p+0#e000e06&|3| +0#0000000&@71
+|s+0#af5f00255&|p+0#e000e06&|g| +0#0000000&@71
+|s+0#af5f00255&|p+0#e000e06&|r| +0#0000000&@71
+>s+0#af5f00255&|r+0#e000e06&|3| +0#0000000&@71
+|s+0#af5f00255&|r+0#e000e06&|g| +0#0000000&@71
+|s+0#af5f00255&|r+0#e000e06&|p| +0#0000000&@71
+@75
+|s+0#af5f00255&|3+0#e000e06&|g|p| +0#0000000&@70
+|s+0#af5f00255&|3+0#e000e06&|g|r| +0#0000000&@70
+|s+0#af5f00255&|3+0#e000e06&|p|g| +0#0000000&@70
+|s+0#af5f00255&|3+0#e000e06&|p|r| +0#0000000&@70
+|s+0#af5f00255&|3+0#e000e06&|r|g| +0#0000000&@70
+|s+0#af5f00255&|3+0#e000e06&|r|p| +0#0000000&@70
+|s+0#af5f00255&|g+0#e000e06&|3|p| +0#0000000&@70
+|s+0#af5f00255&|g+0#e000e06&|3|r| +0#0000000&@70
+|s+0#af5f00255&|g+0#e000e06&|p|3| +0#0000000&@70
+|s+0#af5f00255&|g+0#e000e06&|p|r| +0#0000000&@70
+@57|6|4|9|,|1| @8|7|9|%|
diff --git a/runtime/syntax/testdir/dumps/ed_commands_37.dump b/runtime/syntax/testdir/dumps/ed_commands_37.dump
new file mode 100644
index 000000000..1df42b4cd
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/ed_commands_37.dump
@@ -0,0 +1,20 @@
+|s+0#af5f00255#ffffff0|g+0#e000e06&|p|r| +0#0000000&@70
+|s+0#af5f00255&|g+0#e000e06&|r|3| +0#0000000&@70
+|s+0#af5f00255&|g+0#e000e06&|r|p| +0#0000000&@70
+|s+0#af5f00255&|p+0#e000e06&|3|g| +0#0000000&@70
+|s+0#af5f00255&|p+0#e000e06&|3|r| +0#0000000&@70
+>s+0#af5f00255&|p+0#e000e06&|g|3| +0#0000000&@70
+|s+0#af5f00255&|p+0#e000e06&|g|r| +0#0000000&@70
+|s+0#af5f00255&|p+0#e000e06&|r|3| +0#0000000&@70
+|s+0#af5f00255&|p+0#e000e06&|r|g| +0#0000000&@70
+|s+0#af5f00255&|r+0#e000e06&|3|g| +0#0000000&@70
+|s+0#af5f00255&|r+0#e000e06&|3|p| +0#0000000&@70
+|s+0#af5f00255&|r+0#e000e06&|g|3| +0#0000000&@70
+|s+0#af5f00255&|r+0#e000e06&|g|p| +0#0000000&@70
+|s+0#af5f00255&|r+0#e000e06&|p|3| +0#0000000&@70
+|s+0#af5f00255&|r+0#e000e06&|p|g| +0#0000000&@70
+@75
+|s+0#af5f00255&|3+0#e000e06&|g|p|r| +0#0000000&@69
+|s+0#af5f00255&|3+0#e000e06&|g|r|p| +0#0000000&@69
+|s+0#af5f00255&|3+0#e000e06&|p|g|r| +0#0000000&@69
+@57|6@1|7|,|1| @8|8|2|%|
diff --git a/runtime/syntax/testdir/dumps/ed_commands_38.dump b/runtime/syntax/testdir/dumps/ed_commands_38.dump
new file mode 100644
index 000000000..ee3ba0311
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/ed_commands_38.dump
@@ -0,0 +1,20 @@
+|s+0#af5f00255#ffffff0|3+0#e000e06&|p|g|r| +0#0000000&@69
+|s+0#af5f00255&|3+0#e000e06&|p|r|g| +0#0000000&@69
+|s+0#af5f00255&|3+0#e000e06&|r|g|p| +0#0000000&@69
+|s+0#af5f00255&|3+0#e000e06&|r|p|g| +0#0000000&@69
+|s+0#af5f00255&|g+0#e000e06&|3|p|r| +0#0000000&@69
+>s+0#af5f00255&|g+0#e000e06&|3|r|p| +0#0000000&@69
+|s+0#af5f00255&|g+0#e000e06&|p|3|r| +0#0000000&@69
+|s+0#af5f00255&|g+0#e000e06&|p|r|3| +0#0000000&@69
+|s+0#af5f00255&|g+0#e000e06&|r|3|p| +0#0000000&@69
+|s+0#af5f00255&|g+0#e000e06&|r|p|3| +0#0000000&@69
+|s+0#af5f00255&|p+0#e000e06&|3|g|r| +0#0000000&@69
+|s+0#af5f00255&|p+0#e000e06&|3|r|g| +0#0000000&@69
+|s+0#af5f00255&|p+0#e000e06&|g|3|r| +0#0000000&@69
+|s+0#af5f00255&|p+0#e000e06&|g|r|3| +0#0000000&@69
+|s+0#af5f00255&|p+0#e000e06&|r|3|g| +0#0000000&@69
+|s+0#af5f00255&|p+0#e000e06&|r|g|3| +0#0000000&@69
+|s+0#af5f00255&|r+0#e000e06&|3|g|p| +0#0000000&@69
+|s+0#af5f00255&|r+0#e000e06&|3|p|g| +0#0000000&@69
+|s+0#af5f00255&|r+0#e000e06&|g|3|p| +0#0000000&@69
+@57|6|8|5|,|1| @8|8|4|%|
diff --git a/runtime/syntax/testdir/dumps/ed_commands_39.dump b/runtime/syntax/testdir/dumps/ed_commands_39.dump
new file mode 100644
index 000000000..ce953910e
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/ed_commands_39.dump
@@ -0,0 +1,20 @@
+|s+0#af5f00255#ffffff0|r+0#e000e06&|g|3|p| +0#0000000&@69
+|s+0#af5f00255&|r+0#e000e06&|g|p|3| +0#0000000&@69
+|s+0#af5f00255&|r+0#e000e06&|p|3|g| +0#0000000&@69
+|s+0#af5f00255&|r+0#e000e06&|p|g|3| +0#0000000&@69
+@75
+>#+0#0000e05&| |r|e|p|e|a|t| |l|a|s|t| |s|u|b|s|t|i|t|u|t|e| |f|l|a|g|s| |a|s| |d|e|l|i|m|i|t|e|r|s| +0#0000000&@30
+@75
+|s+0#af5f00255&|3+0#e000e06&|.+0#0000000&@2|3+0#e000e06&|.+0#0000000&@2|3+0#e000e06&| +0#0000000&@64
+|s+0#af5f00255&|g+0#e000e06&|.+0#0000000&@2|g+0#e000e06&|.+0#0000000&@2|g+0#e000e06&| +0#0000000&@64
+|s+0#af5f00255&|p+0#e000e06&|.+0#0000000&@2|p+0#e000e06&|.+0#0000000&@2|p+0#e000e06&| +0#0000000&@64
+|s+0#af5f00255&|r+0#e000e06&|.+0#0000000&@2|r+0#e000e06&|.+0#0000000&@2|r+0#e000e06&| +0#0000000&@64
+@75
+@75
+|#+0#0000e05&| |C|o|p|y| |C|o|m@1|a|n|d| +0#0000000&@60
+@75
+@75
+|t+0#af5f00255&|$+0#e000002&| +0#0000000&@72
+|.+0#e000002&|,+0#0000000&|.+0#e000002&|t+0#af5f00255&|$+0#e000002&| +0#0000000&@69
+@75
+@57|7|0|3|,|1| @8|8|6|%|
diff --git a/runtime/syntax/testdir/dumps/ed_commands_40.dump b/runtime/syntax/testdir/dumps/ed_commands_40.dump
new file mode 100644
index 000000000..505c07340
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/ed_commands_40.dump
@@ -0,0 +1,20 @@
+| +0&#ffffff0@74
+|t+0#af5f00255&|/+0#e000e06&|p+0#0000000&|a|t@1|e|r|n|/+0#e000e06&| +0#0000000&@64
+|.+0#e000002&|,+0#0000000&|.+0#e000002&|t+0#af5f00255&|/+0#e000e06&|p+0#0000000&|a|t@1|e|r|n|/+0#e000e06&| +0#0000000&@61
+@75
+|t+0#af5f00255&|l| +0#0000000&@72
+>t+0#af5f00255&|n| +0#0000000&@72
+|t+0#af5f00255&|p| +0#0000000&@72
+@75
+|t+0#af5f00255&|$+0#e000002&|l+0#af5f00255&| +0#0000000&@71
+|t+0#af5f00255&|$+0#e000002&|n+0#af5f00255&| +0#0000000&@71
+|t+0#af5f00255&|$+0#e000002&|p+0#af5f00255&| +0#0000000&@71
+@75
+|t+0#af5f00255&|/+0#e000e06&|p+0#0000000&|a|t@1|e|r|n|/+0#e000e06&|l+0#af5f00255&| +0#0000000&@63
+|t+0#af5f00255&|/+0#e000e06&|p+0#0000000&|a|t@1|e|r|n|/+0#e000e06&|n+0#af5f00255&| +0#0000000&@63
+|t+0#af5f00255&|/+0#e000e06&|p+0#0000000&|a|t@1|e|r|n|/+0#e000e06&|p+0#af5f00255&| +0#0000000&@63
+@75
+|#+0#0000e05&| |e|x|t|e|n|s|i|o|n|s| +0#0000000&@62
+@75
+|t+0#af5f00255&|l|n|p| +0#0000000&@70
+@57|7|2|1|,|1| @8|8@1|%|
diff --git a/runtime/syntax/testdir/dumps/ed_commands_41.dump b/runtime/syntax/testdir/dumps/ed_commands_41.dump
new file mode 100644
index 000000000..5dce3cd83
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/ed_commands_41.dump
@@ -0,0 +1,20 @@
+|t+0#af5f00255#ffffff0|l|n|p| +0#0000000&@70
+|t+0#af5f00255&|$+0#e000002&|l+0#af5f00255&|n|p| +0#0000000&@69
+|t+0#af5f00255&|/+0#e000e06&|p+0#0000000&|a|t@1|e|r|n|/+0#e000e06&|l+0#af5f00255&|n|p| +0#0000000&@61
+@75
+@75
+>#+0#0000e05&| |U|n|d|o| |C|o|m@1|a|n|d| +0#0000000&@60
+@75
+@75
+|u+0#af5f00255&| +0#0000000&@73
+@75
+|u+0#af5f00255&|l| +0#0000000&@72
+|u+0#af5f00255&|n| +0#0000000&@72
+|u+0#af5f00255&|p| +0#0000000&@72
+@75
+|#+0#0000e05&| |e|x|t|e|n|s|i|o|n|s| +0#0000000&@62
+@75
+|u+0#af5f00255&|l|n|p| +0#0000000&@70
+@75
+@75
+@57|7|3|9|,|1| @8|9|1|%|
diff --git a/runtime/syntax/testdir/dumps/ed_commands_42.dump b/runtime/syntax/testdir/dumps/ed_commands_42.dump
new file mode 100644
index 000000000..d72a8794e
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/ed_commands_42.dump
@@ -0,0 +1,20 @@
+| +0&#ffffff0@74
+|#+0#0000e05&| |G|l|o|b|a|l| |N|o|n|-|M|a|t|c|h|e|d| |C|o|m@1|a|n|d| +0#0000000&@46
+@75
+@75
+|v+0#af5f00255&|/+0#e000e06&| +0#0000000&@72
+>v+0#af5f00255&|/+0#e000e06&@1| +0#0000000&@71
+|v+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1| @69
+|v+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&| +0#0000000&@68
+@75
+|1+0#e000002&|,+0#0000000&|$+0#e000002&|v+0#af5f00255&|/+0#e000e06&| +0#0000000&@69
+|1+0#e000002&|,+0#0000000&|$+0#e000002&|v+0#af5f00255&|/+0#e000e06&@1| +0#0000000&@68
+|1+0#e000002&|,+0#0000000&|$+0#e000002&|v+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1| @66
+|1+0#e000002&|,+0#0000000&|$+0#e000002&|v+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&| +0#0000000&@65
+@75
+@75
+|#+0#0000e05&| |I|n|t|e|r|a|c|t|i|v|e| |G|l|o|b|a|l| |N|o|n|-|M|a|t|c|h|e|d| |C|o|m@1|a|n|d| +0#0000000&@34
+@75
+@75
+|V+0#af5f00255&|/+0#e000e06&| +0#0000000&@72
+@57|7|5|7|,|1| @8|9|3|%|
diff --git a/runtime/syntax/testdir/dumps/ed_commands_43.dump b/runtime/syntax/testdir/dumps/ed_commands_43.dump
new file mode 100644
index 000000000..4b34f8a0e
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/ed_commands_43.dump
@@ -0,0 +1,20 @@
+|V+0#af5f00255#ffffff0|/+0#e000e06&| +0#0000000&@72
+|V+0#af5f00255&|/+0#e000e06&@1| +0#0000000&@71
+|V+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1| @69
+|V+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&| +0#0000000&@68
+@75
+>1+0#e000002&|,+0#0000000&|$+0#e000002&|V+0#af5f00255&|/+0#e000e06&| +0#0000000&@69
+|1+0#e000002&|,+0#0000000&|$+0#e000002&|V+0#af5f00255&|/+0#e000e06&@1| +0#0000000&@68
+|1+0#e000002&|,+0#0000000&|$+0#e000002&|V+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1| @66
+|1+0#e000002&|,+0#0000000&|$+0#e000002&|V+0#af5f00255&|/+0#e000e06&|f+0#0000000&|o@1|/+0#e000e06&| +0#0000000&@65
+@75
+@75
+|#+0#0000e05&| |W|r|i|t|e| |C|o|m@1|a|n|d| +0#0000000&@59
+@75
+@75
+|w+0#af5f00255&| +0#0000000&@73
+|1+0#e000002&|,+0#0000000&|$+0#e000002&|w+0#af5f00255&| +0#0000000&@70
+|w+0#af5f00255&| +0#0000000&|f|i|l|e|n|a|m|e| @64
+|1+0#e000002&|,+0#0000000&|$+0#e000002&|w+0#af5f00255&| +0#0000000&|f|i|l|e|n|a|m|e| @61
+@75
+@57|7@1|5|,|1| @8|9|5|%|
diff --git a/runtime/syntax/testdir/dumps/ed_commands_44.dump b/runtime/syntax/testdir/dumps/ed_commands_44.dump
new file mode 100644
index 000000000..82aeda867
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/ed_commands_44.dump
@@ -0,0 +1,20 @@
+| +0&#ffffff0@74
+@75
+|#+0#0000e05&| |L|i|n|e| |N|u|m|b|e|r| |C|o|m@1|a|n|d| +0#0000000&@53
+@75
+@75
+>=+0#af5f00255&| +0#0000000&@73
+|$+0#e000002&|=+0#af5f00255&| +0#0000000&@72
+@75
+|=+0#af5f00255&|l| +0#0000000&@72
+|=+0#af5f00255&|n| +0#0000000&@72
+|=+0#af5f00255&|p| +0#0000000&@72
+@75
+|#+0#0000e05&| |e|x|t|e|n|s|i|o|n|s| +0#0000000&@62
+@75
+|=+0#af5f00255&|l|n|p| +0#0000000&@70
+@75
+@75
+|#+0#0000e05&| |S|h|e|l@1| |E|s|c|a|p|e| |C|o|m@1|a|n|d| +0#0000000&@52
+@75
+@57|7|9|3|,|1| @8|9|7|%|
diff --git a/runtime/syntax/testdir/dumps/ed_commands_45.dump b/runtime/syntax/testdir/dumps/ed_commands_45.dump
new file mode 100644
index 000000000..aca707cf4
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/ed_commands_45.dump
@@ -0,0 +1,20 @@
+| +0&#ffffff0@74
+@75
+|!+0#af5f00255&|e+0#0000000&|c|h|o| |"|F|o@1|"| @63
+@75
+|!+0#af5f00255&|!+0#e000002&| +0#0000000&@72
+> @74
+|!+0#af5f00255&|e+0#0000000&|c|h|o| |%+0#e000e06&| +0#0000000&@67
+|!+0#af5f00255&|e+0#0000000&|c|h|o| |\+0#e000e06&|%| +0#0000000&@66
+|!+0#af5f00255&|e+0#0000000&|c|h|o| |\+0#e000e06&@1|%| +0#0000000&@65
+|!+0#af5f00255&|e+0#0000000&|c|h|o| |\+0#e000e06&@2|%| +0#0000000&@64
+|!+0#af5f00255&|e+0#0000000&|c|h|o| |\+0#e000e06&@3|%| +0#0000000&@63
+@75
+@75
+|#+0#0000e05&| |N|u|l@1| |C|o|m@1|a|n|d| +0#0000000&@60
+@75
+@75
+|.+0#e000002&|++0#e000e06&|1| +0#0000000&@71
+@75
+@75
+@57|8|1@1|,|0|-|1| @6|B|o|t|
diff --git a/runtime/syntax/testdir/input/ed_addresses.ed b/runtime/syntax/testdir/input/ed_addresses.ed
new file mode 100644
index 000000000..c1961e3f1
--- /dev/null
+++ b/runtime/syntax/testdir/input/ed_addresses.ed
@@ -0,0 +1,274 @@
+# ed(1)
+# VIM_TEST_SETUP hi link edAddressSeparator Todo
+
+
+# Addresses
+
+.
+$
+42
+'a
+/foo/
+/foo
+?foo?
+?foo
++
+-
++42
+-42
+
+.p
+$p
+42p
+'ap
+/foo/p
+?foo?p
++p
+-p
++42p
+-42p
+
+
+# pattern delimiters
+
+/\/foo\/bar\//
+?\?foo\?bar\??
+/\/foo\/bar\/
+?\?foo\?bar\?
+
+/foo[/]bar/
+?foo[?]bar?
+/foo[/]bar
+?foo[?]bar
+
+
+# Modifiers
+
+
+# offsets
+
+.+
+.-
+.+42
+.-42
+.+42-42
+.-42+42
+.+-42
+.-+42
+.+42-
+.-42+
+.42+-
+.42-+
+
+$+
+$-
+$+42
+$-42
+$+42-42
+$-42+42
+$+-42
+$-+42
+$+42-
+$-42+
+$42+-
+$42-+
+
+42+
+42-
+42+42
+42-42
+42+42-42
+42-42+42
+42+-42
+42-+42
+42+42-
+42-42+
+42 42+-
+42 42-+
+
+'a+
+'a-
+'a+42
+'a-42
+'a+42-42
+'a-42+42
+'a+-42
+'a-+42
+'a+42-
+'a-42+
+'a42+-
+'a42-+
+
+/foo/+
+/foo/-
+/foo/+42
+/foo/-42
+/foo/+42-42
+/foo/-42+42
+/foo/+-42
+/foo/-+42
+/foo/+42-
+/foo/-42+
+/foo/42+-
+/foo/42-+
+
+?foo?+
+?foo?-
+?foo?+42
+?foo?-42
+?foo?+42-42
+?foo?-42+42
+?foo?+-42
+?foo?-+42
+?foo?+42-
+?foo?-42+
+?foo?42+-
+?foo?42-+
+
+# counts
+
+.42
+/foo/42
+?foo?42
+
+# whitespace
+
+. - + -42 +42 42 42 - 42 + 42
+
+
+# Ranges
+
+,
+;
+
+,,
+;;
+,;
+;,
+
+,.
+,$
+,42
+,'a
+,/foo/
+,/foo
+,?foo?
+,?foo
+,+
+,-
+,+42
+,-42
+
+;.
+;$
+;42
+;'a
+;/foo/
+;/foo
+;?foo?
+;?foo
+;+
+;-
+;+42
+;-42
+
+.,
+$,
+42,
+'a,
+/foo/,
+?foo?,
++,
+-,
++42,
+-42,
+
+.;
+$;
+42;
+'a;
+/foo/;
+?foo?;
++;
+-;
++42;
+-42;
+
+.,42
+$,42
+42,42
+'a,42
+/foo/,42
+?foo?,42
++,42
+-,42
++42,42
+-42,42
+
+42,.
+42,$
+42,42
+42,'a
+42,/foo/
+42,/foo
+42,?foo?
+42,?foo
+42,+
+42,-
+42,+42
+42,-42
+
+.;42
+$;42
+42;42
+'a;42
+/foo/;42
+?foo?;42
++;42
+-;42
++42;42
+-42;42
+
+42;.
+42;$
+42;42
+42;'a
+42;/foo/
+42;/foo
+42;?foo?
+42;?foo
+42;+
+42;-
+42;+42
+42;-42
+
+
+# whitespace
+
+. , .
+$ , $
+42 , 42
+'a , 'a
+/foo/ , /foo/
+?foo? , ?foo?
+/foo/ , /foo
+?foo? , ?foo
++ , +
+- , -
++42 , +42
+-42 , -42
+
+. ; .
+$ ; $
+42 ; 42
+'a ; 'a
+/foo/ ; /foo/
+?foo? ; ?foo?
+/foo/ ; /foo
+?foo? ; ?foo
++ ; +
+- ; -
++42 ; +42
+-42 ; -42
+
+
diff --git a/runtime/syntax/testdir/input/ed_commands.ed b/runtime/syntax/testdir/input/ed_commands.ed
new file mode 100644
index 000000000..dabf08b7b
--- /dev/null
+++ b/runtime/syntax/testdir/input/ed_commands.ed
@@ -0,0 +1,824 @@
+# ed(1) commands
+
+
+# Append Command
+
+
+a
+.
+
+a
+line 1
+.
+
+a
+line 1
+line 2
+line 3
+.
+
+an
+line 1
+.
+
+al
+line 1
+.
+
+ap
+line 1
+.
+
+.a
+line 1
+.
+
+# extensions
+
+alnp
+line 1
+.
+
+# global subcommand
+
+g/foo/a\
+.
+
+g/foo/a\
+line 1
+
+g/foo/a\
+line 1\
+.
+
+g/foo/a\
+line 1\
+.\
+p
+
+g/foo/al\
+line 1\
+.
+
+# Change Command
+
+
+c
+.
+
+c
+line 1
+.
+
+c
+line 1
+line 2
+line 3
+.
+
+cn
+line 1
+.
+
+cl
+line 1
+.
+
+cp
+line 1
+.
+
+.,.c
+line 1
+.
+
+# extensions
+
+clnp
+line 1
+.
+
+# global subcommand
+
+g/foo/c\
+.
+
+g/foo/c\
+line 1
+
+g/foo/c\
+line 1\
+.
+
+g/foo/c\
+line 1\
+.\
+p
+
+g/foo/cl\
+line 1\
+.
+
+
+# Delete Command
+
+
+d
+.,.d
+
+dl
+dn
+dp
+
+# extensions
+
+dlnp
+
+
+# Edit Command
+
+
+e
+e filename
+
+e !echo Input text
+e !!
+
+
+# Edit Without Checking Command
+
+
+E
+E filename
+
+
+# Filename Command
+
+
+f
+f filename
+
+
+# Global Command
+
+
+g/
+g//
+g/foo
+g/foo/
+
+1,$g/
+1,$g//
+1,$g/foo
+1,$g/foo/
+
+g//p
+g//\
+p
+
+g//l\
+n\
+p
+g//\
+l\
+n\
+p
+
+1,$g/foo/p
+1,$g/foo/.,+1p
+1,$g/foo/\
+.,+1p
+
+
+# Interactive Global Command
+
+
+G/
+G//
+G/foo
+G/foo/
+
+1,$G/
+1,$G//
+1,$G/foo
+1,$G/foo/
+
+G/foo/
+d
+&
+
+
+# Help Command
+
+h
+
+hl
+hn
+hp
+
+
+# extensions
+
+hlnp
+
+
+# Help Mode Command
+
+H
+
+Hl
+Hn
+Hp
+
+# extensions
+
+Hlnp
+
+
+# Insert Command
+
+
+i
+.
+
+i
+line 1
+.
+
+i
+line 1
+line 2
+line 3
+.
+
+in
+line 1
+.
+
+il
+line 1
+.
+
+ip
+line 1
+.
+
+.i
+line 1
+.
+
+# extensions
+
+ilnp
+line 1
+.
+
+# global subcommand
+
+g/foo/i\
+.
+
+g/foo/i\
+line 1
+
+g/foo/i\
+line 1\
+.
+
+g/foo/i\
+line 1\
+.\
+p
+
+g/foo/il\
+line 1\
+.
+
+
+# Join Command
+
+
+j
+.,.+1j
+
+jl
+jn
+jp
+
+# extensions
+
+jlnp
+
+
+# Mark Command
+
+
+ka
+.ka
+
+kal
+kan
+kap
+
+# extensions
+
+kalnp
+
+
+# List Command
+
+
+l
+.,.l
+
+ll
+ln
+lp
+
+# extensions
+
+llnp
+
+
+# Move Command
+
+
+m$
+.,.m$
+
+m/pattern/
+.,.m/pattern/
+
+ml
+mn
+mp
+
+m$l
+m$n
+m$p
+
+m/pattern/l
+m/pattern/n
+m/pattern/p
+
+# extensions
+
+mlnp
+m$lnp
+m/pattern/lnp
+
+
+# Number Command
+
+
+n
+.,.n
+
+nl
+nn
+np
+
+# extensions
+
+nlnp
+
+
+# Print Command
+
+
+p
+.,.p
+
+pl
+pn
+pp
+
+# extensions
+
+plnp
+
+
+# Prompt Command
+
+
+P
+
+Pl
+Pn
+Pp
+
+# extensions
+
+Plnp
+
+
+# Quit Command
+
+
+q
+
+
+# Quit Without Checking Command
+
+Q
+
+
+# Read Command
+
+r
+r filename
+$r
+$r filename
+
+r !echo Input text
+r !!
+
+
+# Substitute Command
+
+
+s/foo/bar/
+.,.s/foo/bar/
+
+s//bar
+
+s/foo/barbaz
+s/foo/bar\
+baz
+s/foo/bar\
+baz/
+
+s/foo/bar&baz
+s/foo/bar&\
+baz
+s/foo/bar&\
+baz/
+
+s/foo/%
+s/foo/%/
+
+s/foo/\%
+s/foo/\%/
+s/foo/%%
+s/foo/%%/
+s/foo/%a
+s/foo/%a/
+s/foo/a%
+s/foo/a%/
+s/foo/%a%
+s/foo/%a%/
+
+s/foo/bar baz/
+s/foo/bar baz/
+s/foo/bar baz/
+s/foo/bar baz/
+s/foo/bar baz/
+s/foo/bar baz/
+s/foo/bar baz/
+s/foo/bar\8baz/
+s/foo/bar\9baz/
+
+s/foo/bar baz/
+s/foo/bar baz/
+s/foo/bar
baz/
+s/foo/bar baz/
+s/foo/bar baz/
+s/foo/bar
baz/
+s/foo/bar baz/
+s/foo/bar baz/
+s/foo/bar 8baz/
+s/foo/bar 9baz/
+
+
+# flags
+
+s/foo/bar/g
+s/foo/bar/l
+s/foo/bar/n
+s/foo/bar/p
+
+s/foo/bar/gl
+s/foo/bar/gn
+s/foo/bar/gp
+s/foo/bar/lg
+s/foo/bar/ln
+s/foo/bar/lp
+s/foo/bar/ng
+s/foo/bar/nl
+s/foo/bar/np
+s/foo/bar/pg
+s/foo/bar/pl
+s/foo/bar/pn
+
+s/foo/bar/gln
+s/foo/bar/glp
+s/foo/bar/gnl
+s/foo/bar/gnp
+s/foo/bar/gpl
+s/foo/bar/gpn
+s/foo/bar/lgn
+s/foo/bar/lgp
+s/foo/bar/lng
+s/foo/bar/lnp
+s/foo/bar/lpg
+s/foo/bar/lpn
+s/foo/bar/ngl
+s/foo/bar/ngp
+s/foo/bar/nlg
+s/foo/bar/nlp
+s/foo/bar/npg
+s/foo/bar/npl
+s/foo/bar/pgl
+s/foo/bar/pgn
+s/foo/bar/plg
+s/foo/bar/pln
+s/foo/bar/png
+s/foo/bar/pnl
+
+s/foo/bar/glnp
+s/foo/bar/glpn
+s/foo/bar/gnlp
+s/foo/bar/gnpl
+s/foo/bar/gpln
+s/foo/bar/gpnl
+s/foo/bar/lgnp
+s/foo/bar/lgpn
+s/foo/bar/lngp
+s/foo/bar/lnpg
+s/foo/bar/lpgn
+s/foo/bar/lpng
+s/foo/bar/nglp
+s/foo/bar/ngpl
+s/foo/bar/nlgp
+s/foo/bar/nlpg
+s/foo/bar/npgl
+s/foo/bar/nplg
+s/foo/bar/pgln
+s/foo/bar/pgnl
+s/foo/bar/plgn
+s/foo/bar/plng
+s/foo/bar/pngl
+s/foo/bar/pnlg
+
+
+s/foo/bar/3
+s/foo/bar/l
+s/foo/bar/n
+s/foo/bar/p
+
+s/foo/bar/3l
+s/foo/bar/3n
+s/foo/bar/3p
+s/foo/bar/l3
+s/foo/bar/ln
+s/foo/bar/lp
+s/foo/bar/n3
+s/foo/bar/nl
+s/foo/bar/np
+s/foo/bar/p3
+s/foo/bar/pl
+s/foo/bar/pn
+
+s/foo/bar/3ln
+s/foo/bar/3lp
+s/foo/bar/3nl
+s/foo/bar/3np
+s/foo/bar/3pl
+s/foo/bar/3pn
+s/foo/bar/l3n
+s/foo/bar/l3p
+s/foo/bar/ln3
+s/foo/bar/lnp
+s/foo/bar/lp3
+s/foo/bar/lpn
+s/foo/bar/n3l
+s/foo/bar/n3p
+s/foo/bar/nl3
+s/foo/bar/nlp
+s/foo/bar/np3
+s/foo/bar/npl
+s/foo/bar/p3l
+s/foo/bar/p3n
+s/foo/bar/pl3
+s/foo/bar/pln
+s/foo/bar/pn3
+s/foo/bar/pnl
+
+s/foo/bar/3lnp
+s/foo/bar/3lpn
+s/foo/bar/3nlp
+s/foo/bar/3npl
+s/foo/bar/3pln
+s/foo/bar/3pnl
+s/foo/bar/l3np
+s/foo/bar/l3pn
+s/foo/bar/ln3p
+s/foo/bar/lnp3
+s/foo/bar/lp3n
+s/foo/bar/lpn3
+s/foo/bar/n3lp
+s/foo/bar/n3pl
+s/foo/bar/nl3p
+s/foo/bar/nlp3
+s/foo/bar/np3l
+s/foo/bar/npl3
+s/foo/bar/p3ln
+s/foo/bar/p3nl
+s/foo/bar/pl3n
+s/foo/bar/pln3
+s/foo/bar/pn3l
+s/foo/bar/pnl3
+
+
+# repeat last substitute
+
+s3
+sg
+sp
+sr
+
+s3g
+s3p
+s3r
+sg3
+sgp
+sgr
+sp3
+spg
+spr
+sr3
+srg
+srp
+
+s3gp
+s3gr
+s3pg
+s3pr
+s3rg
+s3rp
+sg3p
+sg3r
+sgp3
+sgpr
+sgr3
+sgrp
+sp3g
+sp3r
+spg3
+spgr
+spr3
+sprg
+sr3g
+sr3p
+srg3
+srgp
+srp3
+srpg
+
+s3gpr
+s3grp
+s3pgr
+s3prg
+s3rgp
+s3rpg
+sg3pr
+sg3rp
+sgp3r
+sgpr3
+sgr3p
+sgrp3
+sp3gr
+sp3rg
+spg3r
+spgr3
+spr3g
+sprg3
+sr3gp
+sr3pg
+srg3p
+srgp3
+srp3g
+srpg3
+
+# repeat last substitute flags as delimiters
+
+s3...3...3
+sg...g...g
+sp...p...p
+sr...r...r
+
+
+# Copy Command
+
+
+t$
+.,.t$
+
+t/pattern/
+.,.t/pattern/
+
+tl
+tn
+tp
+
+t$l
+t$n
+t$p
+
+t/pattern/l
+t/pattern/n
+t/pattern/p
+
+# extensions
+
+tlnp
+t$lnp
+t/pattern/lnp
+
+
+# Undo Command
+
+
+u
+
+ul
+un
+up
+
+# extensions
+
+ulnp
+
+
+# Global Non-Matched Command
+
+
+v/
+v//
+v/foo
+v/foo/
+
+1,$v/
+1,$v//
+1,$v/foo
+1,$v/foo/
+
+
+# Interactive Global Non-Matched Command
+
+
+V/
+V//
+V/foo
+V/foo/
+
+1,$V/
+1,$V//
+1,$V/foo
+1,$V/foo/
+
+
+# Write Command
+
+
+w
+1,$w
+w filename
+1,$w filename
+
+
+# Line Number Command
+
+
+=
+$=
+
+=l
+=n
+=p
+
+# extensions
+
+=lnp
+
+
+# Shell Escape Command
+
+
+!echo "Foo"
+
+!!
+
+!echo %
+!echo \%
+!echo \%
+!echo \\%
+!echo \\%
+
+
+# Null Command
+
+
+.+1
+
+
diff --git a/src/testdir/test_filetype.vim b/src/testdir/test_filetype.vim
index 9eff14029..59020deae 100644
--- a/src/testdir/test_filetype.vim
+++ b/src/testdir/test_filetype.vim
@@ -271,6 +271,7 @@ def s:GetFilenameChecks(): dict<list<string>>
dylanlid: ['file.lid'],
earthfile: ['Earthfile'],
ecd: ['file.ecd'],
+ ed: ['file.ed'],
edif: ['file.edf', 'file.edif', 'file.edo'],
editorconfig: ['.editorconfig'],
eelixir: ['file.eex', 'file.leex'],
@@ -1161,6 +1162,7 @@ def s:GetScriptChecks(): dict<list<list<string>>>
dart: [['#!/path/dart']],
bpftrace: [['#!/path/bpftrace']],
vim: [['#!/path/vim']],
+ ed: [['#!/usr/bin/ed -f']],
}
enddef
diff --git a/src/version.c b/src/version.c
index c69281a7a..d1497635b 100644
--- a/src/version.c
+++ b/src/version.c
@@ -758,6 +758,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
+/**/
+ 894,
/**/
893,
/**/