Update runtime files.
diff --git a/runtime/autoload/tohtml.vim b/runtime/autoload/tohtml.vim
index 270891a..1086347 100644
--- a/runtime/autoload/tohtml.vim
+++ b/runtime/autoload/tohtml.vim
@@ -1,6 +1,6 @@
 " Vim autoload file for the tohtml plugin.
 " Maintainer: Ben Fritz <fritzophrenic@gmail.com>
-" Last Change: 2019 Aug 16
+" Last Change: 2023 Jan 01
 "
 " Additional contributors:
 "
@@ -351,63 +351,65 @@
   let s:old_magic = &magic
   set magic
 
-  if s:settings.use_xhtml
-    if s:settings.encoding != ""
-      let xml_line = "<?xml version=\"1.0\" encoding=\"" . s:settings.encoding . "\"?>"
-    else
-      let xml_line = "<?xml version=\"1.0\"?>"
-    endif
-    let tag_close = ' />'
-  endif
-
-  let style = [s:settings.use_xhtml ? "" : '-->']
-  let body_line = ''
-
   let html = []
-  let s:html5 = 0
-  if s:settings.use_xhtml
-    call add(html, xml_line)
-  endif
-  if s:settings.use_xhtml
-    call add(html, "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">")
-    call add(html, '<html xmlns="http://www.w3.org/1999/xhtml">')
-  elseif s:settings.use_css && !s:settings.no_pre
-    call add(html, "<!DOCTYPE html>")
-    call add(html, '<html>')
-    let s:html5 = 1
-  else
-    call add(html, '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"')
-    call add(html, '  "http://www.w3.org/TR/html4/loose.dtd">')
-    call add(html, '<html>')
-  endif
-  call add(html, '<head>')
-
-  " include encoding as close to the top as possible, but only if not already
-  " contained in XML information
-  if s:settings.encoding != "" && !s:settings.use_xhtml
-    if s:html5
-      call add(html, '<meta charset="' . s:settings.encoding . '"' . tag_close)
-    else
-      call add(html, "<meta http-equiv=\"content-type\" content=\"text/html; charset=" . s:settings.encoding . '"' . tag_close)
+  if !s:settings.no_doc
+    if s:settings.use_xhtml
+      if s:settings.encoding != ""
+	let xml_line = "<?xml version=\"1.0\" encoding=\"" . s:settings.encoding . "\"?>"
+      else
+	let xml_line = "<?xml version=\"1.0\"?>"
+      endif
+      let tag_close = ' />'
     endif
+
+    let style = [s:settings.use_xhtml ? "" : '-->']
+    let body_line = ''
+
+    let s:html5 = 0
+    if s:settings.use_xhtml
+      call add(html, xml_line)
+    endif
+    if s:settings.use_xhtml
+      call add(html, "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">")
+      call add(html, '<html xmlns="http://www.w3.org/1999/xhtml">')
+    elseif s:settings.use_css && !s:settings.no_pre
+      call add(html, "<!DOCTYPE html>")
+      call add(html, '<html>')
+      let s:html5 = 1
+    else
+      call add(html, '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"')
+      call add(html, '  "http://www.w3.org/TR/html4/loose.dtd">')
+      call add(html, '<html>')
+    endif
+    call add(html, '<head>')
+
+    " include encoding as close to the top as possible, but only if not already
+    " contained in XML information
+    if s:settings.encoding != "" && !s:settings.use_xhtml
+      if s:html5
+	call add(html, '<meta charset="' . s:settings.encoding . '"' . tag_close)
+      else
+	call add(html, "<meta http-equiv=\"content-type\" content=\"text/html; charset=" . s:settings.encoding . '"' . tag_close)
+      endif
+    endif
+
+    call add(html, '<title>diff</title>')
+    call add(html, '<meta name="Generator" content="Vim/'.v:version/100.'.'.v:version%100.'"'.tag_close)
+    call add(html, '<meta name="plugin-version" content="'.g:loaded_2html_plugin.'"'.tag_close)
+    call add(html, '<meta name="settings" content="'.
+	  \ join(filter(keys(s:settings),'s:settings[v:val]'),',').
+	  \ ',prevent_copy='.s:settings.prevent_copy.
+	  \ ',use_input_for_pc='.s:settings.use_input_for_pc.
+	  \ '"'.tag_close)
+    call add(html, '<meta name="colorscheme" content="'.
+	  \ (exists('g:colors_name')
+	  \ ? g:colors_name
+	  \ : 'none'). '"'.tag_close)
+
+    call add(html, '</head>')
+    let body_line_num = len(html)
+    call add(html, '<body'.(s:settings.line_ids ? ' onload="JumpToLine();"' : '').'>')
   endif
-
-  call add(html, '<title>diff</title>')
-  call add(html, '<meta name="Generator" content="Vim/'.v:version/100.'.'.v:version%100.'"'.tag_close)
-  call add(html, '<meta name="plugin-version" content="'.g:loaded_2html_plugin.'"'.tag_close)
-  call add(html, '<meta name="settings" content="'.
-	\ join(filter(keys(s:settings),'s:settings[v:val]'),',').
-	\ ',prevent_copy='.s:settings.prevent_copy.
-	\ ',use_input_for_pc='.s:settings.use_input_for_pc.
-	\ '"'.tag_close)
-  call add(html, '<meta name="colorscheme" content="'.
-	\ (exists('g:colors_name')
-	\ ? g:colors_name
-	\ : 'none'). '"'.tag_close)
-
-  call add(html, '</head>')
-  let body_line_num = len(html)
-  call add(html, '<body'.(s:settings.line_ids ? ' onload="JumpToLine();"' : '').'>')
   call add(html, "<table ".(s:settings.use_css? "" : "border='1' width='100%' ")."id='vimCodeElement".s:settings.id_suffix."'>")
 
   call add(html, '<tr>')
@@ -430,47 +432,53 @@
     " When not using CSS or when using xhtml, the <body> line can be important.
     " Assume it will be the same for all buffers and grab it from the first
     " buffer. Similarly, need to grab the body end line as well.
-    if body_line == ''
+    if !s:settings.no_doc
+      if body_line == ''
+	1
+	call search('<body')
+	let body_line = getline('.')
+	$
+	call search('</body>', 'b')
+	let s:body_end_line = getline('.')
+      endif
+
+      " Grab the style information. Some of this will be duplicated so only insert
+      " it if it's not already there. {{{
       1
-      call search('<body')
-      let body_line = getline('.')
-      $
-      call search('</body>', 'b')
-      let s:body_end_line = getline('.')
-    endif
-
-    " Grab the style information. Some of this will be duplicated so only insert
-    " it if it's not already there. {{{
-    1
-    let style_start = search('^<style\( type="text/css"\)\?>')
-    1
-    let style_end = search('^</style>')
-    if style_start > 0 && style_end > 0
-      let buf_styles = getline(style_start + 1, style_end - 1)
-      for a_style in buf_styles
-	if index(style, a_style) == -1
-	  if diff_style_start == 0
-	    if a_style =~ '\<Diff\(Change\|Text\|Add\|Delete\)'
-	      let diff_style_start = len(style)-1
+      let style_start = search('^<style\( type="text/css"\)\?>')
+      1
+      let style_end = search('^</style>')
+      if style_start > 0 && style_end > 0
+	let buf_styles = getline(style_start + 1, style_end - 1)
+	for a_style in buf_styles
+	  if index(style, a_style) == -1
+	    if diff_style_start == 0
+	      if a_style =~ '\<Diff\(Change\|Text\|Add\|Delete\)'
+		let diff_style_start = len(style)-1
+	      endif
 	    endif
+	    call insert(style, a_style, insert_index)
+	    let insert_index += 1
 	  endif
-	  call insert(style, a_style, insert_index)
-	  let insert_index += 1
-	endif
-      endfor
-    endif " }}}
+	endfor
+      endif " }}}
 
-    " everything new will get added before the diff styles so diff highlight
-    " properly overrides normal highlight
-    if diff_style_start != 0
-      let insert_index = diff_style_start
+      " everything new will get added before the diff styles so diff highlight
+      " properly overrides normal highlight
+      if diff_style_start != 0
+	let insert_index = diff_style_start
+      endif
+
+      " Delete those parts that are not needed so we can include the rest into the
+      " resulting table.
+      1,/^<body.*\%(\n<!--.*-->\_s\+.*id='oneCharWidth'.*\_s\+.*id='oneInputWidth'.*\_s\+.*id='oneEmWidth'\)\?\zs/d_
+      $
+      ?</body>?,$d_
+    elseif !s:settings.no_modeline
+      " remove modeline from source files if it is included and we haven't deleted
+      " due to removing html footer already
+      $d
     endif
-
-    " Delete those parts that are not needed so we can include the rest into the
-    " resulting table.
-    1,/^<body.*\%(\n<!--.*-->\_s\+.*id='oneCharWidth'.*\_s\+.*id='oneInputWidth'.*\_s\+.*id='oneEmWidth'\)\?\zs/d_
-    $
-    ?</body>?,$d_
     let temp = getline(1,'$')
     " clean out id on the main content container because we already set it on
     " the table
@@ -478,7 +486,11 @@
     " undo deletion of start and end part
     " so we can later save the file as valid html
     " TODO: restore using grabbed lines if undolevel is 1?
-    normal! 2u
+    if !s:settings.no_doc
+      normal! 2u
+    elseif !s:settings.no_modeline
+      normal! u
+    endif
     if s:settings.use_css
       call add(html, '<td><div>')
     elseif s:settings.use_xhtml
@@ -495,17 +507,23 @@
     quit!
   endfor
 
-  let html[body_line_num] = body_line
+  if !s:settings.no_doc
+    let html[body_line_num] = body_line
+  endif
 
   call add(html, '</tr>')
   call add(html, '</table>')
-  call add(html, s:body_end_line)
-  call add(html, '</html>')
+  if !s:settings.no_doc
+    call add(html, s:body_end_line)
+    call add(html, '</html>')
+  endif
 
   " The generated HTML is admittedly ugly and takes a LONG time to fold.
   " Make sure the user doesn't do syntax folding when loading a generated file,
   " using a modeline.
-  call add(html, '<!-- vim: set foldmethod=manual : -->')
+  if !s:settings.no_modeline
+    call add(html, '<!-- vim: set foldmethod=manual : -->')
+  endif
 
   let i = 1
   let name = "Diff" . (s:settings.use_xhtml ? ".xhtml" : ".html")
@@ -542,129 +560,131 @@
 
   call append(0, html)
 
-  if len(style) > 0
-    1
-    let style_start = search('^</head>')-1
+  if !s:settings.no_doc
+    if len(style) > 0
+      1
+      let style_start = search('^</head>')-1
 
-    " add required javascript in reverse order so we can just call append again
-    " and again without adjusting {{{
+      " add required javascript in reverse order so we can just call append again
+      " and again without adjusting {{{
 
-    let s:uses_script = s:settings.dynamic_folds || s:settings.line_ids
+      let s:uses_script = s:settings.dynamic_folds || s:settings.line_ids
 
-    " insert script closing tag if needed
-    if s:uses_script
-      call append(style_start, [
-	    \ '',
-	    \ s:settings.use_xhtml ? '//]]>' : '-->',
-	    \ "</script>"
-	    \ ])
-    endif
-
-    " insert javascript to get IDs from line numbers, and to open a fold before
-    " jumping to any lines contained therein
-    if s:settings.line_ids
-      call append(style_start, [
-	    \ "  /* Always jump to new location even if the line was hidden inside a fold, or",
-	    \ "   * we corrected the raw number to a line ID.",
-	    \ "   */",
-	    \ "  if (lineElem) {",
-	    \ "    lineElem.scrollIntoView(true);",
-	    \ "  }",
-	    \ "  return true;",
-	    \ "}",
-	    \ "if ('onhashchange' in window) {",
-	    \ "  window.onhashchange = JumpToLine;",
-	    \ "}"
-	    \ ])
-
-      if s:settings.dynamic_folds
+      " insert script closing tag if needed
+      if s:uses_script
 	call append(style_start, [
-	      \ "",
-	      \ "  /* navigate upwards in the DOM tree to open all folds containing the line */",
-	      \ "  var node = lineElem;",
-	      \ "  while (node && node.id != 'vimCodeElement".s:settings.id_suffix."')",
-	      \ "  {",
-	      \ "    if (node.className == 'closed-fold')",
-	      \ "    {",
-	      \ "      /* toggle open the fold ID (remove window ID) */",
-	      \ "      toggleFold(node.id.substr(4));",
-	      \ "    }",
-	      \ "    node = node.parentNode;",
-	      \ "  }",
+	      \ '',
+	      \ s:settings.use_xhtml ? '//]]>' : '-->',
+	      \ "</script>"
 	      \ ])
       endif
-    endif
 
-    if s:settings.line_ids
-      call append(style_start, [
-	    \ "",
-	    \ "/* function to open any folds containing a jumped-to line before jumping to it */",
-	    \ "function JumpToLine()",
-	    \ "{",
-	    \ "  var lineNum;",
-	    \ "  lineNum = window.location.hash;",
-	    \ "  lineNum = lineNum.substr(1); /* strip off '#' */",
-	    \ "",
-	    \ "  if (lineNum.indexOf('L') == -1) {",
-	    \ "    lineNum = 'L'+lineNum;",
-	    \ "  }",
-	    \ "  if (lineNum.indexOf('W') == -1) {",
-	    \ "    lineNum = 'W1'+lineNum;",
-	    \ "  }",
-	    \ "  var lineElem = document.getElementById(lineNum);"
-	    \ ])
-    endif
+      " insert javascript to get IDs from line numbers, and to open a fold before
+      " jumping to any lines contained therein
+      if s:settings.line_ids
+	call append(style_start, [
+	      \ "  /* Always jump to new location even if the line was hidden inside a fold, or",
+	      \ "   * we corrected the raw number to a line ID.",
+	      \ "   */",
+	      \ "  if (lineElem) {",
+	      \ "    lineElem.scrollIntoView(true);",
+	      \ "  }",
+	      \ "  return true;",
+	      \ "}",
+	      \ "if ('onhashchange' in window) {",
+	      \ "  window.onhashchange = JumpToLine;",
+	      \ "}"
+	      \ ])
 
-    " Insert javascript to toggle matching folds open and closed in all windows,
-    " if dynamic folding is active.
-    if s:settings.dynamic_folds
-      call append(style_start, [
-	    \  "  function toggleFold(objID)",
-	    \  "  {",
-	    \  "    for (win_num = 1; win_num <= ".len(a:buf_list)."; win_num++)",
-	    \  "    {",
-	    \  "      var fold;",
-	    \  '      fold = document.getElementById("win"+win_num+objID);',
-	    \  "      if(fold.className == 'closed-fold')",
-	    \  "      {",
-	    \  "        fold.className = 'open-fold';",
-	    \  "      }",
-	    \  "      else if (fold.className == 'open-fold')",
-	    \  "      {",
-	    \  "        fold.className = 'closed-fold';",
-	    \  "      }",
-	    \  "    }",
-	    \  "  }",
-	    \ ])
-    endif
+	if s:settings.dynamic_folds
+	  call append(style_start, [
+		\ "",
+		\ "  /* navigate upwards in the DOM tree to open all folds containing the line */",
+		\ "  var node = lineElem;",
+		\ "  while (node && node.id != 'vimCodeElement".s:settings.id_suffix."')",
+		\ "  {",
+		\ "    if (node.className == 'closed-fold')",
+		\ "    {",
+		\ "      /* toggle open the fold ID (remove window ID) */",
+		\ "      toggleFold(node.id.substr(4));",
+		\ "    }",
+		\ "    node = node.parentNode;",
+		\ "  }",
+		\ ])
+	endif
+      endif
 
-    if s:uses_script
-      " insert script tag if needed
-      call append(style_start, [
-	    \ "<script" . (s:html5 ? "" : " type='text/javascript'") . ">",
-	    \ s:settings.use_xhtml ? '//<![CDATA[' : "<!--"])
-    endif
+      if s:settings.line_ids
+	call append(style_start, [
+	      \ "",
+	      \ "/* function to open any folds containing a jumped-to line before jumping to it */",
+	      \ "function JumpToLine()",
+	      \ "{",
+	      \ "  var lineNum;",
+	      \ "  lineNum = window.location.hash;",
+	      \ "  lineNum = lineNum.substr(1); /* strip off '#' */",
+	      \ "",
+	      \ "  if (lineNum.indexOf('L') == -1) {",
+	      \ "    lineNum = 'L'+lineNum;",
+	      \ "  }",
+	      \ "  if (lineNum.indexOf('W') == -1) {",
+	      \ "    lineNum = 'W1'+lineNum;",
+	      \ "  }",
+	      \ "  var lineElem = document.getElementById(lineNum);"
+	      \ ])
+      endif
 
-    " Insert styles from all the generated html documents and additional styles
-    " for the table-based layout of the side-by-side diff. The diff should take
-    " up the full browser window (but not more), and be static in size,
-    " horizontally scrollable when the lines are too long. Otherwise, the diff
-    " is pretty useless for really long lines. {{{
-    if s:settings.use_css
-      call append(style_start,
-	    \ ['<style' . (s:html5 ? '' : 'type="text/css"') . '>']+
-	    \ style+
-	    \ [ s:settings.use_xhtml ? '' : '<!--',
-	    \   'table { table-layout: fixed; }',
-	    \   'html, body, table, tbody { width: 100%; margin: 0; padding: 0; }',
-	    \   'table, td, th { border: 1px solid; }',
-	    \   'td { vertical-align: top; }',
-	    \   'th, td { width: '.printf("%.1f",100.0/len(a:win_list)).'%; }',
-	    \   'td div { overflow: auto; }',
-	    \   s:settings.use_xhtml ? '' : '-->',
-	    \   '</style>'
-	    \])
-    endif "}}}
+      " Insert javascript to toggle matching folds open and closed in all windows,
+      " if dynamic folding is active.
+      if s:settings.dynamic_folds
+	call append(style_start, [
+	      \  "  function toggleFold(objID)",
+	      \  "  {",
+	      \  "    for (win_num = 1; win_num <= ".len(a:buf_list)."; win_num++)",
+	      \  "    {",
+	      \  "      var fold;",
+	      \  '      fold = document.getElementById("win"+win_num+objID);',
+	      \  "      if(fold.className == 'closed-fold')",
+	      \  "      {",
+	      \  "        fold.className = 'open-fold';",
+	      \  "      }",
+	      \  "      else if (fold.className == 'open-fold')",
+	      \  "      {",
+	      \  "        fold.className = 'closed-fold';",
+	      \  "      }",
+	      \  "    }",
+	      \  "  }",
+	      \ ])
+      endif
+
+      if s:uses_script
+	" insert script tag if needed
+	call append(style_start, [
+	      \ "<script" . (s:html5 ? "" : " type='text/javascript'") . ">",
+	      \ s:settings.use_xhtml ? '//<![CDATA[' : "<!--"])
+      endif
+
+      " Insert styles from all the generated html documents and additional styles
+      " for the table-based layout of the side-by-side diff. The diff should take
+      " up the full browser window (but not more), and be static in size,
+      " horizontally scrollable when the lines are too long. Otherwise, the diff
+      " is pretty useless for really long lines. {{{
+      if s:settings.use_css
+	call append(style_start,
+	      \ ['<style' . (s:html5 ? '' : 'type="text/css"') . '>']+
+	      \ style+
+	      \ [ s:settings.use_xhtml ? '' : '<!--',
+	      \   'table { table-layout: fixed; }',
+	      \   'html, body, table, tbody { width: 100%; margin: 0; padding: 0; }',
+	      \   'table, td, th { border: 1px solid; }',
+	      \   'td { vertical-align: top; }',
+	      \   'th, td { width: '.printf("%.1f",100.0/len(a:win_list)).'%; }',
+	      \   'td div { overflow: auto; }',
+	      \   s:settings.use_xhtml ? '' : '-->',
+	      \   '</style>'
+	      \])
+      endif "}}}
+    endif
   endif
 
   let &paste = s:old_paste