patch 9.0.0753: some Ex commands are not in the help index

Problem:    Some Ex commands are not in the help index.
Solution:   Add the missing commands.  Add a script to check all Ex commands
            are in the help index. (Yee Cheng Chin, closes #11371)
diff --git a/src/testdir/Make_all.mak b/src/testdir/Make_all.mak
index 743da38..04ccb48 100644
--- a/src/testdir/Make_all.mak
+++ b/src/testdir/Make_all.mak
@@ -91,6 +91,7 @@
 	test_cjk_linebreak \
 	test_clientserver \
 	test_close_count \
+	test_cmd_lists \
 	test_cmdline \
 	test_cmdmods \
 	test_cmdwin \
@@ -351,6 +352,7 @@
 	test_cjk_linebreak.res \
 	test_clientserver.res \
 	test_close_count.res \
+	test_cmd_lists.res \
 	test_cmdline.res \
 	test_cmdmods.res \
 	test_cmdwin.res \
diff --git a/src/testdir/test_cmd_lists.vim b/src/testdir/test_cmd_lists.vim
new file mode 100644
index 0000000..4a8904d
--- /dev/null
+++ b/src/testdir/test_cmd_lists.vim
@@ -0,0 +1,68 @@
+" Test to verify that the cmd list in runtime/doc/index.txt contains all of
+" the commands in src/ex_cmds.h. It doesn't map the other way round because
+" index.txt contains some shorthands like :!! which are useful to list, but
+" they don't exist as an independent entry in src/ex_cmds.h.
+"
+" Currently this just checks for existence, and we aren't checking for whether
+" they are sorted in the index, or whether the substring needed (e.g.
+" 'defc[ompile]') is correct or not.
+
+func Test_cmd_lists()
+
+  " Create a list of the commands in ex_cmds.h:CMD_index.
+  enew!
+  read ../ex_cmds.h
+  1,/^enum CMD_index$/d
+  call search('^};$')
+  .,$d
+  v/^EXCMD/d
+  %s/^.*"\(\S\+\)".*$/\1/
+  " Special case ':*' because it's represented as ':star'
+  %s/^\*$/star/
+  sort u
+  let l:command_list = getline(1, '$')
+
+  " Verify that the ':help ex-cmd-index' list contains all known commands.
+  enew!
+  if filereadable('../../doc/index.txt')
+    " unpacked MS-Windows zip archive
+    read ../../doc/index.txt
+  else
+    read ../../runtime/doc/index.txt
+  endif
+  call search('\*ex-cmd-index\*')
+  1,.d
+  v/^|:/d
+  %s/^|:\(\S*\)|.*/\1/
+  sort u
+  norm gg
+  let l:missing_cmds = []
+  for cmd in l:command_list
+    " Reserved Vim 9 commands or other script-only syntax aren't useful to
+    " document as Ex commands.
+    let l:vim9cmds = [
+          \ 'abstract',
+          \ 'class',
+          \ 'endclass',
+          \ 'endenum',
+          \ 'endinterface',
+          \ 'enum',
+          \ 'interface',
+          \ 'static',
+          \ 'type',
+          \ '++',
+          \ '--',
+          \ '{',
+          \ '}']
+    if index(l:vim9cmds, cmd) != -1
+      continue
+    endif
+
+    if search('^\V' .. cmd .. '\v$', 'cW') == 0
+      call add(l:missing_cmds, ':' .. cmd)
+    endif
+  endfor
+  call assert_equal(0, len(l:missing_cmds), "Missing commands from `:help ex-cmd-index`: " .. string(l:missing_cmds))
+endfunc
+
+" vim: shiftwidth=2 sts=2 expandtab
diff --git a/src/version.c b/src/version.c
index bedbdc0..3bb2a2f 100644
--- a/src/version.c
+++ b/src/version.c
@@ -696,6 +696,8 @@
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    753,
+/**/
     752,
 /**/
     751,