changeset 3713:9910cbff5f16

Updated runtime files.
author Bram Moolenaar <bram@vim.org>
date Wed, 25 Jul 2012 17:49:10 +0200
parents a0b8a8a9867d
children baba6286c91e
files runtime/autoload/tohtml.vim runtime/compiler/mcs.vim runtime/doc/index.txt runtime/doc/motion.txt runtime/doc/pi_gzip.txt runtime/doc/syntax.txt runtime/doc/tags runtime/doc/todo.txt runtime/doc/visual.txt runtime/indent/xml.vim runtime/keymap/belarusian-jcuken.vim runtime/mswin.vim runtime/plugin/tohtml.vim runtime/syntax/2html.vim runtime/syntax/help.vim runtime/syntax/svn.vim runtime/tools/efm_perl.pl
diffstat 17 files changed, 1325 insertions(+), 408 deletions(-) [+]
line wrap: on
line diff
--- 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: 2011 Apr 05
+" Last Change: 2012 Jun 30
 "
 " Additional contributors:
 "
@@ -11,7 +11,7 @@
 
 " this file uses line continuations
 let s:cpo_sav = &cpo
-set cpo-=C
+set cpo&vim
 
 " Automatically find charsets from all encodings supported natively by Vim. With
 " the 8bit- and 2byte- prefixes, Vim can actually support more encodings than
@@ -391,12 +391,25 @@ func! tohtml#Diff2HTML(win_list, buf_lis
   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.
 	\ '"'.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>')
-  call add(html, '<table border="1" width="100%">')
+  if !empty(s:settings.prevent_copy)
+    call add(html, "<body onload='FixCharWidth();'>")
+    call add(html, "<!-- hidden divs used by javascript to get the width of a char -->")
+    call add(html, "<div id='oneCharWidth'>0</div>")
+    call add(html, "<div id='oneInputWidth'><input size='1' value='0'".tag_close."</div>")
+    call add(html, "<div id='oneEmWidth' style='width: 1em;'></div>")
+  else
+    call add(html, '<body>')
+  endif
+  call add(html, "<table border='1' width='100%' id='vimCodeElement'>")
 
   call add(html, '<tr>')
   for buf in a:win_list
@@ -454,16 +467,19 @@ func! tohtml#Diff2HTML(win_list, buf_lis
       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/d_
+    " 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
+    let temp[0] = substitute(temp[0], " id='vimCodeElement'", "", "")
     " undo deletion of start and end part
     " so we can later save the file as valid html
     " TODO: restore using grabbed lines if undolevel is 1?
-    normal 2u
+    normal! 2u
     if s:settings.use_css
       call add(html, '<td valign="top"><div>')
     elseif s:settings.use_xhtml
@@ -520,12 +536,47 @@ func! tohtml#Diff2HTML(win_list, buf_lis
     1
     let style_start = search('^</head>')-1
 
+    " add required javascript in reverse order so we can just call append again
+    " and again without adjusting {{{
+
+    " insert script closing tag if any javascript is needed
+    if s:settings.dynamic_folds || !empty(s:settings.prevent_copy)
+      call append(style_start, [
+	    \ '',
+	    \ s:settings.use_xhtml ? '//]]>' : '-->',
+	    \ "</script>"
+	    \ ])
+    endif
+
+    " insert script which corrects the size of small input elements in
+    " prevent_copy mode. See 2html.vim for details on why this is needed and how
+    " it works.
+    if !empty(s:settings.prevent_copy)
+      call append(style_start, [
+	    \ '',
+	    \ '/* simulate a "ch" unit by asking the browser how big a zero character is */',
+	    \ 'function FixCharWidth() {',
+	    \ '  /* get the hidden element which gives the width of a single character */',
+	    \ '  var goodWidth = document.getElementById("oneCharWidth").clientWidth;',
+	    \ '  /* get all input elements, we''ll filter on class later */',
+	    \ '  var inputTags = document.getElementsByTagName("input");',
+	    \ '  var ratio = 5;',
+	    \ '  var inputWidth = document.getElementById("oneInputWidth").clientWidth;',
+	    \ '  var emWidth = document.getElementById("oneEmWidth").clientWidth;',
+	    \ '  if (inputWidth > goodWidth) {',
+	    \ '    while (ratio < 100*goodWidth/emWidth && ratio < 100) {',
+	    \ '    ratio += 5;',
+	    \ '  }',
+	    \ '  document.getElementById("vimCodeElement").className = "em"+ratio;',
+	    \ '  }',
+	    \ '}'
+	    \ ])
+    endif
+
     " Insert javascript to toggle matching folds open and closed in all windows,
-    " if dynamic folding is active. {{{
+    " if dynamic folding is active.
     if s:settings.dynamic_folds
       call append(style_start, [
-	    \  "<script type='text/javascript'>",
-	    \  s:settings.use_xhtml ? '//<![CDATA[' : "  <!--",
 	    \  "  function toggleFold(objID)",
 	    \  "  {",
 	    \  "    for (win_num = 1; win_num <= ".len(a:buf_list)."; win_num++)",
@@ -542,9 +593,14 @@ func! tohtml#Diff2HTML(win_list, buf_lis
 	    \  "      }",
 	    \  "    }",
 	    \  "  }",
-	    \  s:settings.use_xhtml ? '//]]>' : "  -->",
-	    \  "</script>"
 	    \ ])
+    endif
+
+    " insert script tag if any javascript is needed
+    if s:settings.dynamic_folds || s:settings.prevent_copy != ""
+      call append(style_start, [
+	    \ "<script type='text/javascript'>",
+	    \ s:settings.use_xhtml ? '//<![CDATA[' : "<!--"])
     endif "}}}
 
     " Insert styles from all the generated html documents and additional styles
@@ -609,9 +665,10 @@ func! tohtml#GetUserSettings() "{{{
     call tohtml#GetOption(user_settings, 'ignore_conceal', 0 )
     call tohtml#GetOption(user_settings, 'ignore_folding', 0 )
     call tohtml#GetOption(user_settings,  'dynamic_folds', 0 )
-    call tohtml#GetOption(user_settings,  'no_foldcolumn', 0 )
+    call tohtml#GetOption(user_settings,  'no_foldcolumn', user_settings.ignore_folding)
     call tohtml#GetOption(user_settings,   'hover_unfold', 0 )
     call tohtml#GetOption(user_settings,         'no_pre', 0 )
+    call tohtml#GetOption(user_settings,     'no_invalid', 0 )
     call tohtml#GetOption(user_settings,   'whole_filler', 0 )
     call tohtml#GetOption(user_settings,      'use_xhtml', 0 )
     " }}}
@@ -637,6 +694,8 @@ func! tohtml#GetUserSettings() "{{{
     " dynamic folding implies css
     if user_settings.dynamic_folds
       let user_settings.use_css = 1
+    else
+      let user_settings.no_foldcolumn = 1 " won't do anything but for consistency and for the test suite
     endif
 
     " if we're not using CSS we cannot use a pre section because <font> tags
@@ -663,6 +722,7 @@ func! tohtml#GetUserSettings() "{{{
     endif
     " }}}
 
+    " textual options
     if exists("g:html_use_encoding") "{{{
       " user specified the desired MIME charset, figure out proper
       " 'fileencoding' from it or warn the user if we cannot
@@ -705,6 +765,45 @@ func! tohtml#GetUserSettings() "{{{
       endif
     endif "}}}
 
+    " Default to making nothing uncopyable, because we default to
+    " not-standards way of doing things, and also because Microsoft Word and
+    " others paste the <input> elements anyway.
+    "
+    " html_prevent_copy only has an effect when using CSS.
+    "
+    " All options:
+    "	  f - fold column
+    "	  n - line numbers (also within fold text)
+    "	  t - fold text
+    "	  d - diff filler
+    "	  c - concealed text (reserved future)
+    "	  l - listchars (reserved possible future)
+    "	  s - signs (reserved possible future)
+    "
+    " Normal text is always selectable.
+    let user_settings.prevent_copy = ""
+    if user_settings.use_css
+      if exists("g:html_prevent_copy")
+	if user_settings.dynamic_folds && !user_settings.no_foldcolumn && g:html_prevent_copy =~# 'f'
+	  let user_settings.prevent_copy .= 'f'
+	endif
+	if user_settings.number_lines && g:html_prevent_copy =~# 'n'
+	  let user_settings.prevent_copy .= 'n'
+	endif
+	if &diff && g:html_prevent_copy =~# 'd'
+	  let user_settings.prevent_copy .= 'd'
+	endif
+	if !user_settings.ignore_folding && g:html_prevent_copy =~# 't'
+	  let user_settings.prevent_copy .= 't'
+	endif
+      else
+	let user_settings.prevent_copy = ""
+      endif
+    endif
+    if empty(user_settings.prevent_copy)
+      let user_settings.no_invalid = 0
+    endif
+
     " TODO: font
 
     return user_settings
--- a/runtime/compiler/mcs.vim
+++ b/runtime/compiler/mcs.vim
@@ -1,7 +1,8 @@
 " Vim compiler file
 " Compiler:    Mono C# Compiler
 " Maintainer:  Jarek Sobiecki <harijari@go2.pl>
-" Latest Revision: 2006-06-18
+" Last Updated By: Peter Collingbourne
+" Latest Revision: 2012 Jul 19
 
 if exists("current_compiler")
   finish
@@ -12,13 +13,18 @@ let s:cpo_save = &cpo
 set cpo-=C
 
 setlocal errorformat=
+         \%D%.%#Project\ \"%f/%[%^/\"]%#\"%.%#,
+         \%X%.%#Done\ building\ project\ \"%f/%[%^/\"]%#\"%.%#,
+         \%-G%\\s%.%#,
+         \%E%f(%l):\ error\ CS%n:%m,
+         \%W%f(%l):\ warning\ CS%n:%m,
          \%E%f(%l\\,%c):\ error\ CS%n:%m,
          \%W%f(%l\\,%c):\ warning\ CS%n:%m,
          \%E%>syntax\ error\\,%m,%Z%f(%l\\,%c):\ error\ CS%n:%m,
          \%D%*\\a[%*\\d]:\ Entering\ directory\ `%f',
          \%X%*\\a[%*\\d]:\ Leaving\ directory\ `%f',
          \%DMaking\ %*\\a\ in\ %f,
-         \%G-%.%#
+         \%-G%.%#
 
 let &cpo = s:cpo_save
 unlet s:cpo_save
--- a/runtime/doc/index.txt
+++ b/runtime/doc/index.txt
@@ -1,4 +1,4 @@
-*index.txt*     For Vim version 7.3.  Last change: 2011 Aug 06
+*index.txt*     For Vim version 7.3.  Last change: 2012 Jul 25
 
 
 		  VIM REFERENCE MANUAL    by Bram Moolenaar
@@ -719,6 +719,8 @@ tag		char	      note action in Normal mo
 |gH|		gH		   start Select line mode
 |gI|		gI		2  like "I", but always start in column 1
 |gJ|		gJ		2  join lines without inserting space
+|gN|		gN	      1,2  find the previous match with the last used
+				   search pattern and Visually select it
 |gP|		["x]gP		2  put the text [from register x] before the
 				   cursor N times, leave the cursor after it
 |gQ|		gQ		    switch to "Ex" mode with Vim editing
--- a/runtime/doc/motion.txt
+++ b/runtime/doc/motion.txt
@@ -1,4 +1,4 @@
-*motion.txt*    For Vim version 7.3.  Last change: 2012 Jul 06
+*motion.txt*    For Vim version 7.3.  Last change: 2012 Jul 25
 
 
 		  VIM REFERENCE MANUAL    by Bram Moolenaar
@@ -57,7 +57,7 @@ or change text.  The following operators
 	|>|	>	shift right
 	|<|	<	shift left
 	|zf|	zf	define a fold
-	|g@|    g@      call function set with the 'operatorfunc' option
+	|g@|	g@	call function set with the 'operatorfunc' option
 
 If the motion includes a count and the operator also had a count before it,
 the two counts are multiplied.  For example: "2d3w" deletes six words.
@@ -513,6 +513,8 @@ always select less text than the "a" com
 These commands are {not in Vi}.
 These commands are not available when the |+textobjects| feature has been
 disabled at compile time.
+Also see `gn` and `gN`, operating on the last search pattern.
+
 							*v_aw* *aw*
 aw			"a word", select [count] words (see |word|).
 			Leading or trailing white space is included, but not
@@ -689,6 +691,7 @@ movement commands are used.
 	"daw"	delete a word				*daw*
 	"diW"	delete inner WORD (see |WORD|)		*diW*
 	"daW"	delete a WORD (see |WORD|)		*daW*
+	"dgn"   delete the next search pattern match    *dgn*
 	"dd"	delete one line				|dd|
 	"dis"	delete inner sentence			*dis*
 	"das"	delete a sentence			*das*
--- a/runtime/doc/pi_gzip.txt
+++ b/runtime/doc/pi_gzip.txt
@@ -1,4 +1,4 @@
-*pi_gzip.txt*   For Vim version 7.3.  Last change: 2002 Oct 29
+*pi_gzip.txt*   For Vim version 7.3.  Last change: 2012 Jul 19
 
 
 		  VIM REFERENCE MANUAL    by Bram Moolenaar
@@ -25,6 +25,8 @@ with these extensions:
 	*.Z		compress (Lempel-Ziv)
 	*.gz		gzip
 	*.bz2		bzip2
+	*.lzma		lzma
+	*.xz		xz
 
 That's actually the only thing you need to know.  There are no options.
 
--- a/runtime/doc/syntax.txt
+++ b/runtime/doc/syntax.txt
@@ -1,4 +1,4 @@
-*syntax.txt*	For Vim version 7.3.  Last change: 2012 Jun 13
+*syntax.txt*	For Vim version 7.3.  Last change: 2012 Jul 16
 
 
 		  VIM REFERENCE MANUAL	  by Bram Moolenaar
@@ -380,194 +380,23 @@ 2HTML						*2html.vim* *convert-to-HTML*
 This is not a syntax file itself, but a script that converts the current
 window into HTML.  Vim opens a new window in which it builds the HTML file.
 
+After you save the resulting file, you can view it with any browser.  The
+colors should be exactly the same as you see them in Vim.
+
 You are not supposed to set the 'filetype' or 'syntax' option to "2html"!
 Source the script to convert the current file: >
 
 	:runtime! syntax/2html.vim
 <
-							*:TOhtml*
-Or use the ":TOhtml" user command.  It is defined in a standard plugin.
-":TOhtml" also works with a range and in a Visual area: >
-
-	:10,40TOhtml
-
-Warning: This can be slow! The script must process every character of every
-line. Because it can take a long time, by default a progress bar is displayed
-in the statusline for each major step in the conversion process. If you don't
-like seeing this progress bar, you can disable it and get a very minor speed
-improvement with: >
-
-	let g:html_no_progress = 1
-
-":TOhtml" has another special feature: if the window is in diff mode, it will
-generate HTML that shows all the related windows.  This can be disabled by
-setting the g:html_diff_one_file variable: >
-
-	let g:html_diff_one_file = 1
-
-After you save the resulting file, you can view it with any browser.  The
-colors should be exactly the same as you see them in Vim.
-
-To restrict the conversion to a range of lines, use a range with the |:TOhtml|
-command, or set "g:html_start_line" and "g:html_end_line" to the first and
-last line to be converted.  Example, using the last set Visual area: >
-
-	:let g:html_start_line = line("'<")
-	:let g:html_end_line = line("'>")
-
-The lines are numbered according to 'number' option and the Number
-highlighting.  You can force lines to be numbered in the HTML output by
-setting "html_number_lines" to non-zero value: >
-   :let g:html_number_lines = 1
-Force to omit the line numbers by using a zero value: >
-   :let g:html_number_lines = 0
-Go back to the default to use 'number' by deleting the variable: >
-   :unlet g:html_number_lines
-
-By default, valid HTML 4.01 using cascading style sheets (CSS1) is generated.
-If you need to generate markup for really old browsers or some other user
-agent that lacks basic CSS support, use: >
-   :let g:html_use_css = 0
-
-Concealed text is removed from the HTML and replaced with the appropriate
-character from |:syn-cchar| or 'listchars' depending on the current value of
-'conceallevel'. If you always want to display all text in your document,
-either set 'conceallevel' to zero before invoking 2html, or use: >
-   :let g:html_ignore_conceal = 1
-
-Similarly, closed folds are put in the HTML as they are displayed.  If you
-don't want this, use the |zR| command before invoking 2html, or use: >
-   :let g:html_ignore_folding = 1
-
-You may want to generate HTML that includes all the data within the folds, and
-allow the user to view the folded data similar to how they would in Vim. To
-generate this dynamic fold information, use: >
-   :let g:html_dynamic_folds = 1
-
-Using html_dynamic_folds will imply html_use_css, because it would be far too
-difficult to do it for old browsers. However, html_ignore_folding overrides
-html_dynamic_folds.
-
-Using html_dynamic_folds will default to generating a foldcolumn in the html
-similar to Vim's foldcolumn, that will use javascript to open and close the
-folds in the HTML document. The width of this foldcolumn starts at the current
-setting of |'foldcolumn'| but grows to fit the greatest foldlevel in your
-document. If you do not want to show a foldcolumn at all, use: >
-   :let g:html_no_foldcolumn = 1
-
-Using this option, there will be no foldcolumn available to open the folds in
-the HTML. For this reason, another option is provided: html_hover_unfold.
-Enabling this option will use CSS 2.0 to allow a user to open a fold by
-hovering the mouse pointer over it. Note that old browsers (notably Internet
-Explorer 6) will not support this feature.  Browser-specific markup for IE6 is
-included to fall back to the normal CSS1 code so that the folds show up
-correctly for this browser, but they will not be openable without a
-foldcolumn. Note that using html_hover_unfold will allow modern browsers with
-disabled javascript to view closed folds. To use this option, use: >
-   :let g:html_hover_unfold = 1
-
-Setting html_no_foldcolumn with html_dynamic_folds will automatically set
-html_hover_unfold, because otherwise the folds wouldn't be dynamic.
-
-By default "<pre>" and "</pre>" are used around the text. When 'wrap' is set
-in the window being converted, the CSS 2.0 "white-space:pre-wrap" value is
-used to wrap the text. You can explicitly enable the wrapping with: >
-   :let g:html_pre_wrap = 1
-or disable with >
-   :let g:html_pre_wrap = 0
-This generates HTML that looks very close to the Vim window, but unfortunately
-there can be minor differences such as the lack of a 'showbreak' option in in
-the HTML, or where line breaks can occur.
-
-Another way to obtain text wrapping in the HTML, at the risk of making some
-things look even more different, is to use: >
-   :let g:html_no_pre = 1
-This will use <br> at the end of each line and use "&nbsp;" for repeated
-spaces. Doing it this way is more compatible with old browsers, but modern
-browsers support the "white-space" method.
-
-If you do stick with the default "<pre>" tags, <Tab> characters in the text
-are included in the generated output if they will have no effect on the
-appearance of the text and it looks like they are in the document
-intentionally. This allows for the HTML output to be copied and pasted from a
-browser without losing the actual whitespace used in the document.
-
-Specifically, <Tab> characters will be included if the 'tabstop' option is set
-to the default of 8, 'expandtab' is not set, and if neither the foldcolumn nor
-the line numbers are included in the HTML output (see options above). When any
-of these conditions are not met, any <Tab> characters in the text are expanded
-to the appropriate number of spaces in the HTML output.
-
-When "<pre>" is included, you can force |:TOhtml| to keep the tabs even if the
-other conditions are not met with: >
-   :let g:html_expand_tabs = 0
-Note that this can easily break text alignment and indentation in the HTML.
-
-Force tabs to be expanded even when they would be kept using: >
-   :let g:html_expand_tabs = 1
-
-For diff mode on a single file (with g:html_diff_one_file) a sequence of more
-than 3 filler lines is displayed as three lines with the middle line
-mentioning the total number of inserted lines.  If you prefer to see all the
-inserted lines as with the side-by-side diff, use: >
-    :let g:html_whole_filler = 1
-And to go back to displaying up to three lines again: >
-    :unlet g:html_whole_filler
-
-For most buffers, TOhtml uses the current value of 'fileencoding' if set, or
-'encoding' if not, to determine the charset and 'fileencoding' of the HTML
-file. 'encoding' is always used for certain 'buftype' values. In general, this
-works for the encodings mentioned specifically by name in |encoding-names|,
-but TOhtml will only automatically use those encodings which are widely
-supported. However, you can override this to support specific encodings that
-may not be automatically detected by default.
-
-To overrule all automatic charset detection, set g:html_use_encoding to the
-name of the charset to be used. TOhtml will try to determine the appropriate
-'fileencoding' setting from the charset, but you may need to set it manually
-if TOhtml cannot determine the encoding. It is recommended to set this
-variable to something widely supported, like UTF-8, for anything you will be
-hosting on a webserver: >
-   :let g:html_use_encoding = "UTF-8"
-You can also use this option to omit the line that specifies the charset
-entirely, by setting g:html_use_encoding to an empty string: >
-   :let g:html_use_encoding = ""
-To go back to the automatic mechanism, delete the g:html_use_encoding
-variable: >
-   :unlet g:html_use_encoding
-
-If you specify a charset with g:html_use_encoding for which TOhtml cannot
-automatically detect the corresponding 'fileencoding' setting, you can use
-g:html_encoding_override to allow TOhtml to detect the correct encoding.
-This is a dictionary of charset-encoding pairs that will replace existing
-pairs automatically detected by TOhtml, or supplement with new pairs. For
-example, to allow TOhtml to detect the HTML charset "windows-1252" properly as
-the encoding "8bit-cp1252", use: >
-   :let g:html_encoding_override = {'windows-1252': '8bit-cp1252'}
-<
-The g:html_charset_override is similar, it allows TOhtml to detect the HTML
-charset for any 'fileencoding' or 'encoding' which is not detected
-automatically. You can also use it to override specific existing
-encoding-charset pairs. For example, TOhtml will by default use UTF-8 for all
-Unicode/UCS encodings. To use UTF-16 and UTF-32 instead, use: >
-   :let g:html_charset_override = {'ucs-4': 'UTF-32', 'utf-16': 'UTF-16'}
-
-Note that documents encoded in either UTF-32 or UTF-16 have known
-compatibility problems with at least one major browser.
-
-					    *convert-to-XML* *convert-to-XHTML*
-If you do not like plain HTML, an alternative is to have the script generate
-XHTML (XML compliant HTML). To do this set the "html_use_xhtml" variable: >
-    :let g:html_use_xhtml = 1
-
-Any of the on/off options listed above can be enabled or disabled by setting
-them explicitly to the desired value, or restored to their default by removing
-the variable using |:unlet|.
+Many variables affect the output of 2html.vim; see below. Any of the on/off
+options listed below can be enabled or disabled by setting them explicitly to
+the desired value, or restored to their default by removing the variable using
+|:unlet|.
 
 Remarks:
 - Some truly ancient browsers may not show the background colors.
 - From most browsers you can also print the file (in color)!
-- This version of TOhtml may work with older versions of Vim, but some
+- The latest TOhtml may actually work with older versions of Vim, but some
   features such as conceal support will not function, and the colors may be
   incorrect for an old Vim without GUI support compiled in.
 
@@ -575,6 +404,311 @@ Here is an example how to run the script
 Unix shell: >
    for f in *.[ch]; do gvim -f +"syn on" +"run! syntax/2html.vim" +"wq" +"q" $f; done
 <
+					*g:html_start_line* *g:html_end_line*
+To restrict the conversion to a range of lines, use a range with the |:TOhtml|
+command below, or set "g:html_start_line" and "g:html_end_line" to the first
+and last line to be converted.  Example, using the last set Visual area: >
+
+	:let g:html_start_line = line("'<")
+	:let g:html_end_line = line("'>")
+	:runtime! syntax/2html.vim
+<
+							*:TOhtml*
+:[range]TOhtml		The ":TOhtml" command is defined in a standard plugin.
+			This command will source |2html.vim| for you. When a
+			range is given, set |g:html_start_line| and
+			|g:html_end_line| to the start and end of the range,
+			respectively. Default range is the entire buffer.
+
+			If the current window is part of a |diff|, unless
+			|g:html_diff_one_file| is set, :TOhtml will convert
+			all windows which are part of the diff in the current
+			tab and place them side-by-side in a <table> element
+			in the generated HTML.
+
+			Examples: >
+
+	:10,40TOhtml " convert lines 10-40 to html
+	:'<,'>TOhtml " convert current/last visual selection
+	:TOhtml      " convert entire buffer
+<
+							*g:html_diff_one_file*
+Default: 0.
+When 0, all windows involved in a |diff| in the current tab page are converted
+to HTML and placed side-by-side in a <table> element.
+When 1, only the current buffer is converted.
+Example: >
+
+	let g:html_diff_one_file = 1
+<
+							 *g:html_whole_filler*
+Default: 0.
+When 0, if |g:html_diff_one_file| is 1, a sequence of more than 3 filler lines
+is displayed as three lines with the middle line mentioning the total number
+of inserted lines.
+When 1, always display all inserted lines as if |g:html_diff_one_file| were
+not set.
+>
+    :let g:html_whole_filler = 1
+<
+				     *TOhtml-performance* *g:html_no_progress*
+Default: 0.
+When 0, display a progress bar in the statusline for each major step in the
+2html.vim conversion process.
+When 1, do not display the progress bar. This offers a minor speed improvement
+but you won't have any idea how much longer the conversion might take; for big
+files it can take a long time!
+Example: >
+
+	let g:html_no_progress = 1
+<
+You can obtain better performance improvements by also instructing Vim to not
+run interactively, so that too much time is not taken to redraw as the script
+moves through the buffer, switches windows, and the like: >
+
+  vim -E -s -c "let g:html_no_progress=1" -c "syntax on" -c "set ft=c" -c "runtime syntax/2html.vim" -cwqa myfile.c
+<
+Note that the -s flag prevents loading your .vimrc and any plugins, so you
+need to explicitly source/enable anything that will affect the HTML
+conversion. See |-E| and |-s-ex| for details. It is probably best to create a
+script to replace all the -c commands and use it with the -u flag instead of
+specifying each command separately.
+
+							 *g:html_number_lines*
+Default: current 'number' setting.
+When 0, buffer text is displayed in the generated HTML without line numbering.
+When 1, a column of line numbers is added to the generated HTML with the same
+highlighting as the line number column in Vim (|hl-LineNr|).
+Force line numbers even if 'number' is not set: >
+   :let g:html_number_lines = 1
+Force to omit the line numbers: >
+   :let g:html_number_lines = 0
+Go back to the default to use 'number' by deleting the variable: >
+   :unlet g:html_number_lines
+<
+							      *g:html_use_css*
+Default: 1.
+When 1, generate valid HTML 4.01 markup with CSS1 styling, supported in all
+modern browsers and most old browsers.
+When 0, generate <font> tags and similar outdated markup. This is not
+recommended but it may work better in really old browsers, email clients,
+forum posts, and similar situations where basic CSS support is unavailable.
+Example: >
+   :let g:html_use_css = 0
+<
+						       *g:html_ignore_conceal*
+Default: 0.
+When 0, concealed text is removed from the HTML and replaced with a character
+from |:syn-cchar| or 'listchars' as appropriate, depending on the current
+value of 'conceallevel'.
+When 1, include all text from the buffer in the generated HTML, even if it is
+|conceal|ed.
+
+Either of the following commands will ensure that all text in the buffer is
+included in the generated HTML (unless it is folded): >
+   :let g:html_ignore_conceal = 1
+   :setl conceallevel=0
+<
+						       *g:html_ignore_folding*
+Default: 0.
+When 0, text in a closed fold is replaced by the text shown for the fold in
+Vim (|fold-foldtext|). See |g:html_dynamic_folds| if you also want to allow
+the user to expand the fold as in Vim to see the text inside.
+When 1, include all text from the buffer in the generated HTML; whether the
+text is in a fold has no impact at all. |g:html_dynamic_folds| has no effect.
+
+Either of these commands will ensure that all text in the buffer is included
+in the generated HTML (unless it is concealed): >
+   zR
+   :let g:html_ignore_folding = 1
+<
+							*g:html_dynamic_folds*
+Default: 0.
+When 0, text in a closed fold is not included at all in the generated HTML.
+When 1, generate javascript to open a fold and show the text within, just like
+in Vim.
+
+Setting this variable to 1 causes 2html.vim to always use CSS for styling,
+regardless of what |g:html_use_css| is set to.
+
+This variable is ignored when |g:html_ignore_folding| is set.
+>
+   :let g:html_dynamic_folds = 1
+<
+							*g:html_no_foldcolumn*
+Default: 0.
+When 0, if |g:html_dynamic_folds| is 1, generate a column of text similar to
+Vim's foldcolumn (|fold-foldcolumn|) the user can click on to toggle folds
+open or closed. The minimum width of the generated text column is the current
+'foldcolumn' setting.
+When 1, do not generate this column; instead, hovering the mouse cursor over
+folded text will open the fold as if |g:html_hover_unfold| were set.
+>
+   :let g:html_no_foldcolumn = 1
+<
+				*TOhtml-uncopyable-text* *g:html_prevent_copy*
+Default: empty string.
+This option prevents certain regions of the generated HTML from being copied,
+when you select all text in document rendered in a browser and copy it. Useful
+for allowing users to copy-paste only the source text even if a fold column or
+line numbers are shown in the generated content. Specify regions to be
+affected in this way as follows:
+	f:	fold column
+	n:	line numbers (also within fold text)
+	t:	fold text
+	d:	diff filler
+
+Example, to make the fold column and line numbers uncopyable: >
+	:let g:html_prevent_copy = "fn"
+<
+This feature is currently implemented by inserting read-only <input> elements
+into the markup to contain the uncopyable areas. This does not work well in
+all cases. When pasting to some applications which understand HTML, the
+<input> elements also get pasted. But plain-text paste destinations should
+always work.
+
+							   *g:html_no_invalid*
+Default: 0.
+When 0, if |g:html_prevent_copy| is non-empty, an invalid attribute is
+intentionally inserted into the <input> element for the uncopyable areas. This
+increases the number of applications you can paste to without also pasting the
+<input> elements. Specifically, Microsoft Word will not paste the <input>
+elements if they contain this invalid attribute.
+When 1, no invalid markup is ever intentionally inserted, and the generated
+page should validate. However, be careful pasting into Microsoft Word when
+|g:html_prevent_copy| is non-empty; it can be hard to get rid of the <input>
+elements which get pasted.
+
+							 *g:html_hover_unfold*
+Default: 0.
+When 0, the only way to open a fold generated by 2html.vim with
+|g:html_dynamic_folds| set, is to click on the generated fold column.
+When 1, use CSS 2.0 to allow the user to open a fold by moving the mouse
+cursor over the displayed fold text. This is useful to allow users with
+disabled javascript to view the folded text.
+
+Note that old browsers (notably Internet Explorer 6) will not support this
+feature.  Browser-specific markup for IE6 is included to fall back to the
+normal CSS1 styling so that the folds show up correctly for this browser, but
+they will not be openable without a foldcolumn.
+>
+   :let g:html_hover_unfold = 1
+<
+					  *TOhtml-wrap-text* *g:html_pre_wrap*
+Default: current 'wrap' setting.
+When 0, if |g:html_no_pre| is 0 or unset, the text in the generated HTML does
+not wrap at the edge of the browser window.
+When 1, if |g:html_use_css| is 1, the CSS 2.0 "white-space:pre-wrap" value is
+used, causing the text to wrap at whitespace at the edge of the browser
+window.
+Explicitly enable text wrapping: >
+   :let g:html_pre_wrap = 1
+Explicitly disable wrapping: >
+   :let g:html_pre_wrap = 0
+Go back to default, determine wrapping from 'wrap' setting: >
+   :unlet g:html_pre_wrap
+<
+							       *g:html_no_pre*
+Default: 0.
+When 0, buffer text in the generated HTML is surrounded by <pre>...</pre>
+tags. Series of whitespace is shown as in Vim without special markup, and tab
+characters can be included literally (see |g:html_expand_tabs|).
+When 1 (not recommended), the <pre> tags are omitted, and a plain <div> is
+used instead. Whitespace is replaced by a series of &nbsp; character
+references, and <br> is used to end each line. This is another way to allow
+text in the generated HTML is wrap (see |g:html_pre_wrap|) which also works in
+old browsers, but may cause noticeable differences between Vim's display and
+the rendered page generated by 2html.vim.
+>
+   :let g:html_no_pre = 1
+<
+							  *g:html_expand_tabs*
+Default: 1 if 'tabstop' is 8, 'expandtab' is 0, and no fold column or line
+		numbers occur in the generated HTML;
+	 0 otherwise.
+When 0, <Tab> characters in the buffer text are replaced with an appropriate
+number of space characters, or &nbsp; references if |g:html_no_pre| is 1.
+When 1, if |g:html_no_pre| is 0 or unset, <Tab> characters in the buffer text
+are included as-is in the generated HTML. This is useful for when you want to
+allow copy and paste from a browser without losing the actual whitespace in
+the source document. Note that this can easily break text alignment and
+indentation in the HTML, unless set by default.
+
+Force |2html.vim| to keep <Tab> characters: >
+   :let g:html_expand_tabs = 0
+<
+Force tabs to be expanded: >
+   :let g:html_expand_tabs = 1
+<
+				    *TOhtml-encoding-detect* *TOhtml-encoding*
+It is highly recommended to set your desired encoding with
+|g:html_use_encoding| for any content which will be placed on a web server.
+
+If you do not specify an encoding, |2html.vim| uses the preferred IANA name
+for the current value of 'fileencoding' if set, or 'encoding' if not.
+'encoding' is always used for certain 'buftype' values. 'fileencoding' will be
+set to match the chosen document encoding.
+
+Automatic detection works for the encodings mentioned specifically by name in
+|encoding-names|, but TOhtml will only automatically use those encodings with
+wide browser support. However, you can override this to support specific
+encodings that may not be automatically detected by default (see options
+below). See http://www.iana.org/assignments/character-sets for the IANA names.
+
+Note, by default all Unicode encodings are converted to UTF-8 with no BOM in
+the generated HTML, as recommended by W3C:
+
+	http://www.w3.org/International/questions/qa-choosing-encodings
+	http://www.w3.org/International/questions/qa-byte-order-mark
+
+							 *g:html_use_encoding*
+Default: none, uses IANA name for current 'fileencoding' as above.
+To overrule all automatic charset detection, set g:html_use_encoding to the
+name of the charset to be used. It is recommended to set this variable to
+something widely supported, like UTF-8, for anything you will be hosting on a
+webserver: >
+   :let g:html_use_encoding = "UTF-8"
+You can also use this option to omit the line that specifies the charset
+entirely, by setting g:html_use_encoding to an empty string (NOT recommended): >
+   :let g:html_use_encoding = ""
+To go back to the automatic mechanism, delete the |g:html_use_encoding|
+variable: >
+   :unlet g:html_use_encoding
+<
+						    *g:html_encoding_override*
+Default: none, autoload/tohtml.vim contains default conversions for encodings
+		mentioned by name at |encoding-names|.
+This option allows |2html.vim| to detect the correct 'fileencoding' when you
+specify an encoding with |g:html_use_encoding| which is not in the default
+list of conversions.
+
+This is a dictionary of charset-encoding pairs that will replace existing
+pairs automatically detected by TOhtml, or supplement with new pairs.
+
+Detect the HTML charset "windows-1252" as the encoding "8bit-cp1252": >
+   :let g:html_encoding_override = {'windows-1252': '8bit-cp1252'}
+<
+						     *g:html_charset_override*
+Default: none, autoload/tohtml.vim contains default conversions for encodings
+		mentioned by name at |encoding-names| and which have wide
+		browser support.
+This option allows |2html.vim| to detect the HTML charset for any
+'fileencoding' or 'encoding' which is not detected automatically. You can also
+use it to override specific existing encoding-charset pairs. For example,
+TOhtml will by default use UTF-8 for all Unicode/UCS encodings. To use UTF-16
+and UTF-32 instead, use: >
+   :let g:html_charset_override = {'ucs-4': 'UTF-32', 'utf-16': 'UTF-16'}
+
+Note that documents encoded in either UTF-32 or UTF-16 have known
+compatibility problems with some major browsers.
+
+			*convert-to-XML* *convert-to-XHTML* *g:html_use_xhtml*
+Default: 0.
+When 0, generate standard HTML 4.01 (strict when possible).
+When 1, generate XHTML 1.0 instead (XML compliant HTML).
+>
+    :let g:html_use_xhtml = 1
+<
 
 ABEL						*abel.vim* *ft-abel-syntax*
 
--- a/runtime/doc/tags
+++ b/runtime/doc/tags
@@ -4463,6 +4463,11 @@ Syntax	autocmd.txt	/*Syntax*
 T	motion.txt	/*T*
 TCL	if_tcl.txt	/*TCL*
 TERM	starting.txt	/*TERM*
+TOhtml-encoding	syntax.txt	/*TOhtml-encoding*
+TOhtml-encoding-detect	syntax.txt	/*TOhtml-encoding-detect*
+TOhtml-performance	syntax.txt	/*TOhtml-performance*
+TOhtml-uncopyable-text	syntax.txt	/*TOhtml-uncopyable-text*
+TOhtml-wrap-text	syntax.txt	/*TOhtml-wrap-text*
 TSQL	ft_sql.txt	/*TSQL*
 TTpro-telnet	syntax.txt	/*TTpro-telnet*
 Tab	intro.txt	/*Tab*
@@ -5828,6 +5833,27 @@ g:gnat.Project_File	ft_ada.txt	/*g:gnat.
 g:gnat.Set_Project_File()	ft_ada.txt	/*g:gnat.Set_Project_File()*
 g:gnat.Tags()	ft_ada.txt	/*g:gnat.Tags()*
 g:gnat.Tags_Command	ft_ada.txt	/*g:gnat.Tags_Command*
+g:html_charset_override	syntax.txt	/*g:html_charset_override*
+g:html_diff_one_file	syntax.txt	/*g:html_diff_one_file*
+g:html_dynamic_folds	syntax.txt	/*g:html_dynamic_folds*
+g:html_encoding_override	syntax.txt	/*g:html_encoding_override*
+g:html_end_line	syntax.txt	/*g:html_end_line*
+g:html_expand_tabs	syntax.txt	/*g:html_expand_tabs*
+g:html_hover_unfold	syntax.txt	/*g:html_hover_unfold*
+g:html_ignore_conceal	syntax.txt	/*g:html_ignore_conceal*
+g:html_ignore_folding	syntax.txt	/*g:html_ignore_folding*
+g:html_no_foldcolumn	syntax.txt	/*g:html_no_foldcolumn*
+g:html_no_invalid	syntax.txt	/*g:html_no_invalid*
+g:html_no_pre	syntax.txt	/*g:html_no_pre*
+g:html_no_progress	syntax.txt	/*g:html_no_progress*
+g:html_number_lines	syntax.txt	/*g:html_number_lines*
+g:html_pre_wrap	syntax.txt	/*g:html_pre_wrap*
+g:html_prevent_copy	syntax.txt	/*g:html_prevent_copy*
+g:html_start_line	syntax.txt	/*g:html_start_line*
+g:html_use_css	syntax.txt	/*g:html_use_css*
+g:html_use_encoding	syntax.txt	/*g:html_use_encoding*
+g:html_use_xhtml	syntax.txt	/*g:html_use_xhtml*
+g:html_whole_filler	syntax.txt	/*g:html_whole_filler*
 g:netrw_alto	pi_netrw.txt	/*g:netrw_alto*
 g:netrw_altv	pi_netrw.txt	/*g:netrw_altv*
 g:netrw_banner	pi_netrw.txt	/*g:netrw_banner*
@@ -5949,6 +5975,7 @@ gF	editing.txt	/*gF*
 gH	visual.txt	/*gH*
 gI	insert.txt	/*gI*
 gJ	change.txt	/*gJ*
+gN	visual.txt	/*gN*
 gP	change.txt	/*gP*
 gQ	intro.txt	/*gQ*
 gR	change.txt	/*gR*
@@ -6033,6 +6060,7 @@ glvs-options	pi_getscript.txt	/*glvs-opt
 glvs-plugins	pi_getscript.txt	/*glvs-plugins*
 glvs-usage	pi_getscript.txt	/*glvs-usage*
 gm	motion.txt	/*gm*
+gn	visual.txt	/*gn*
 gnat#Insert_Tags_Header()	ft_ada.txt	/*gnat#Insert_Tags_Header()*
 gnat#New()	ft_ada.txt	/*gnat#New()*
 gnat-xref	ft_ada.txt	/*gnat-xref*
@@ -8296,11 +8324,13 @@ v_d	change.txt	/*v_d*
 v_g?	change.txt	/*v_g?*
 v_gF	editing.txt	/*v_gF*
 v_gJ	change.txt	/*v_gJ*
+v_gN	visual.txt	/*v_gN*
 v_gV	visual.txt	/*v_gV*
 v_g]	tagsrch.txt	/*v_g]*
 v_g_CTRL-G	editing.txt	/*v_g_CTRL-G*
 v_g_CTRL-]	tagsrch.txt	/*v_g_CTRL-]*
 v_gf	editing.txt	/*v_gf*
+v_gn	visual.txt	/*v_gn*
 v_gq	change.txt	/*v_gq*
 v_gv	visual.txt	/*v_gv*
 v_gw	change.txt	/*v_gw*
--- a/runtime/doc/todo.txt
+++ b/runtime/doc/todo.txt
@@ -1,4 +1,4 @@
-*todo.txt*      For Vim version 7.3.  Last change: 2012 Jul 11
+*todo.txt*      For Vim version 7.3.  Last change: 2012 Jul 25
 
 
 		  VIM REFERENCE MANUAL	  by Bram Moolenaar
@@ -48,20 +48,13 @@ List of broken mirrors. (Chris Pentago, 
 
 Javascript file where indent gets stuck on: GalaxyMaster, 2012 May 3.
 
-Patch to fix black on black for terminal with 8 colors.
-(James McCoy, 2012 Jul 10)
-
-Patch to make winrestview() work better. (Lech Lorens, 2012 Jul 10)
-
 The CompleteDone autocommand needs some info passed to it:
 - The word that was selected (empty if abandoned complete)
 - Type of completion: tag, omnifunc, user func.
 
-Completefunc gets number passed instead of string.
-Patch from Yakuhiro Matsumoto, 2012 Jul 10
-
-User command complete can't handle spaces.  Patch by Yasuhiro Matsumoto, 2012
-Jul 11.
+":gundo" command: global undo.  Undoes changes spread over multiple files in
+the order they were made.  Also ":gredo".  Both with a count.  Useful when
+tests fail after making changes and you forgot in which files.
 
 Win32: When a directory name contains an exclamation mark, completion doesn't
 complete the contents of the directory.  No escaping for the "!"? (Jan
@@ -74,15 +67,22 @@ Issue 54: document behavior of -complete
 
 Issue 72: 'autochdir' causes problems for :vimgrep.
 
+Patch for SGR mouse support. (Hayaki Saito, mail from Yakuhiro Matsumoto, 2012
+Jul 13)
+
 MS-Windows: Crash opening very long file name starting with "\\".
 (Christian Brock, 2012 Jun 29)
 
+Patch to fix assigning to scope dictionaries for Python. (ZyX, 2012 Jul 16)
+
 Syntax update problem in one buffer opened in two windows, bottom window is
 not correctly updated. (Paul Harris, 2012 Feb 27)
 
 Patch to add getsid(). (Tyru, 2011 Oct 2)  Do we want this?  Update Oct 4.
 Or use expand('<sid>')?
 
+Patch to improve IME handling. (Yasuhiro Matsumoto, 2012 Jul 18)
+
 MS-Windows resizing problems:
 - Windows window on screen positioning: Patch by Yukihiro Nakadaira, 2012 Jun
   20.  Uses getWindowRect() instead of GetWindowPlacement()
@@ -105,6 +105,7 @@ URXVT:
   http://www.midnight-commander.org/ticket/2662
 
 Patch to add tests for if_xcmdsrv.c., Jul 8, need some more work. (Brian Burns)
+New tests Jul 13.   Update Jul 17.  Discussion Jul 18.
 
 When running Vim in silent ex mode, an existing swapfile causes Vim to wait
 for a user action without a prompt. (Maarten Billemont, 2012 Feb 3)
@@ -123,6 +124,9 @@ Patch for input method status. (Hirohito
 Problem with winfixheight and resizing. (Yukihiro Nakadaira, 2011 Sep 17)
 Patch Sep 18.
 
+Patch for IME problems. Remove hacking code for old IM. (Yukihiro Nakadaira,
+2012 Jul 20)
+
 Patch for has('unnamedplus') docs. (Tony Mechelynck, 2011 Sep 27)
 And one for gui_x11.txt.
 
@@ -135,9 +139,6 @@ And one for gui_x11.txt.
 Problem with starting Visual block mode with :norm when 'virtualedit' is set.
 (David glts, 2012 Jun 5)
 
-When 'guioptions' contains 'c' (use console dialog) then inputdialog() returns
-a different value when the dialog is cancelled. (David Fishburn, 2012 Jul 10)
-
 ":cd" doesn't work when current directory path contains "**".
 finddir() has the same problem.  (Yukihiro Nakadaira, 2012 Jan 10)
 Requires a rewrite of the file_file_in_path code.
--- a/runtime/doc/visual.txt
+++ b/runtime/doc/visual.txt
@@ -1,4 +1,4 @@
-*visual.txt*    For Vim version 7.3.  Last change: 2012 Jun 14
+*visual.txt*    For Vim version 7.3.  Last change: 2012 Jul 25
 
 
 		  VIM REFERENCE MANUAL    by Bram Moolenaar
--- a/runtime/indent/xml.vim
+++ b/runtime/indent/xml.vim
@@ -1,6 +1,6 @@
 " Language:	xml
 " Maintainer:	Johannes Zellner <johannes@zellner.org>
-" Last Change:	2012 May 18
+" Last Change:	2012 Jul 25
 " Notes:	1) does not indent pure non-xml code (e.g. embedded scripts)
 "		2) will be confused by unbalanced tags in comments
 "		or CDATA sections.
@@ -31,8 +31,16 @@ if !exists('b:xml_indent_close')
     " let b:xml_indent_close = '.\{-}</\(address\)\@!'
 endif
 
+let &cpo = s:keepcpo
+unlet s:keepcpo
+
 " [-- finish, if the function already exists --]
-if exists('*XmlIndentGet') | finish | endif
+if exists('*XmlIndentGet')
+  finish
+endif
+
+let s:keepcpo= &cpo
+set cpo&vim
 
 fun! <SID>XmlIndentWithPattern(line, pat)
     let s = substitute('x'.a:line, a:pat, "\1", 'g')
new file mode 100644
--- /dev/null
+++ b/runtime/keymap/belarusian-jcuken.vim
@@ -0,0 +1,87 @@
+" Vim Keymap file for Belarusian characters, layout 'jcuken', classical variant
+" Useful mainly with UTF-8, but may work with other encodings.
+
+" Derived From: russian-jcuken.vim
+" Maintainer:   Aliaksei Nestserau <aliaksei@screencustoms.com>
+" Last Changed: 2012 Jul 23
+
+" All characters are given literally, conversion to another encoding (e.g.,
+" UTF-8) should work.
+scriptencoding utf-8
+
+let b:keymap_name = "by"
+
+loadkeymap
+~	Ð	CYRILLIC CAPITAL LETTER IO
+`	Ñ‘	CYRILLIC SMALL LETTER IO
+F	Ð	CYRILLIC CAPITAL LETTER A
+<	Б	CYRILLIC CAPITAL LETTER BE
+D	Ð’	CYRILLIC CAPITAL LETTER VE
+U	Г	CYRILLIC CAPITAL LETTER GHE
+L	Д	CYRILLIC CAPITAL LETTER DE
+T	Е	CYRILLIC CAPITAL LETTER IE
+:	Ж	CYRILLIC CAPITAL LETTER ZHE
+P	З	CYRILLIC CAPITAL LETTER ZE
+B	І	CYRILLIC CAPITAL LETTER I
+Q	Й	CYRILLIC CAPITAL LETTER SHORT I
+R	К	CYRILLIC CAPITAL LETTER KA
+K	Л	CYRILLIC CAPITAL LETTER EL
+V	М	CYRILLIC CAPITAL LETTER EM
+Y	Ð	CYRILLIC CAPITAL LETTER EN
+J	О	CYRILLIC CAPITAL LETTER O
+G	П	CYRILLIC CAPITAL LETTER PE
+H	Р	CYRILLIC CAPITAL LETTER ER
+C	С	CYRILLIC CAPITAL LETTER ES
+N	Т	CYRILLIC CAPITAL LETTER TE
+E	У	CYRILLIC CAPITAL LETTER U
+A	Ф	CYRILLIC CAPITAL LETTER EF
+{	Х	CYRILLIC CAPITAL LETTER HA
+W	Ц	CYRILLIC CAPITAL LETTER TSE
+X	Ч	CYRILLIC CAPITAL LETTER CHE
+I	Ш	CYRILLIC CAPITAL LETTER SHA
+O	ÐŽ	CYRILLIC CAPITAL LETTER ASYLLABIC U
+}	'	APOSTROPHE
+S	Ы	CYRILLIC CAPITAL LETTER YERU
+M	Ь	CYRILLIC CAPITAL LETTER SOFT SIGN
+\"	Э	CYRILLIC CAPITAL LETTER E
+>	Ю	CYRILLIC CAPITAL LETTER YU
+Z	Я	CYRILLIC CAPITAL LETTER YA
+f	а	CYRILLIC SMALL LETTER A
+,	б	CYRILLIC SMALL LETTER BE
+d	в	CYRILLIC SMALL LETTER VE
+u	г	CYRILLIC SMALL LETTER GHE
+l	д	CYRILLIC SMALL LETTER DE
+t	е	CYRILLIC SMALL LETTER IE
+;	ж	CYRILLIC SMALL LETTER ZHE
+p	з	CYRILLIC SMALL LETTER ZE
+b	Ñ–	CYRILLIC SMALL LETTER I
+q	й	CYRILLIC SMALL LETTER SHORT I
+r	к	CYRILLIC SMALL LETTER KA
+k	л	CYRILLIC SMALL LETTER EL
+v	м	CYRILLIC SMALL LETTER EM
+y	н	CYRILLIC SMALL LETTER EN
+j	о	CYRILLIC SMALL LETTER O
+g	п	CYRILLIC SMALL LETTER PE
+h	р	CYRILLIC SMALL LETTER ER
+c	Ñ	CYRILLIC SMALL LETTER ES
+n	Ñ‚	CYRILLIC SMALL LETTER TE
+e	у	CYRILLIC SMALL LETTER U
+a	Ñ„	CYRILLIC SMALL LETTER EF
+[	Ñ…	CYRILLIC SMALL LETTER HA
+w	ц	CYRILLIC SMALL LETTER TSE
+x	ч	CYRILLIC SMALL LETTER CHE
+i	ш	CYRILLIC SMALL LETTER SHA
+o	Ñž	CYRILLIC SMALL LETTER ASYLLABIC U
+]	'	APOSTROPHE
+s	Ñ‹	CYRILLIC SMALL LETTER YERU
+m	ь	CYRILLIC SMALL LETTER SOFT SIGN
+'	Ñ	CYRILLIC SMALL LETTER E
+.	ÑŽ	CYRILLIC SMALL LETTER YU
+z	Ñ	CYRILLIC SMALL LETTER YA
+@	"
+#	'
+$	*
+%	:
+^	,
+&	.
+*	;
--- a/runtime/mswin.vim
+++ b/runtime/mswin.vim
@@ -1,7 +1,7 @@
 " Set options and add mapping such that Vim behaves a lot like MS-Windows
 "
 " Maintainer:	Bram Moolenaar <Bram@vim.org>
-" Last change:	2012 Jun 13
+" Last change:	2012 Jul 25
 
 " bail out if this isn't wanted (mrsvim.vim uses this).
 if exists("g:skip_loading_mswin") && g:skip_loading_mswin
@@ -45,7 +45,7 @@ cmap <S-Insert>		<C-R>+
 " Use CTRL-G u to have CTRL-Z only undo the paste.
 
 exe 'inoremap <script> <C-V> <C-G>u' . paste#paste_cmd['i']
-exe 'vnoremap <script> <C-V>' . paste#paste_cmd['v']
+exe 'vnoremap <script> <C-V> ' . paste#paste_cmd['v']
 
 imap <S-Insert>		<C-V>
 vmap <S-Insert>		<C-V>
--- a/runtime/plugin/tohtml.vim
+++ b/runtime/plugin/tohtml.vim
@@ -1,40 +1,95 @@
 " Vim plugin for converting a syntax highlighted file to HTML.
 " Maintainer: Ben Fritz <fritzophrenic@gmail.com>
-" Last Change: 2011 May 26
+" Last Change: 2012 Jul 12
 "
 " The core of the code is in $VIMRUNTIME/autoload/tohtml.vim and
 " $VIMRUNTIME/syntax/2html.vim
 "
-" TODO:
+" TODO: {{{
+"   * Bug: still a 1px gap throughout the fold column when html_prevent_copy is
+"     "fn" in some browsers. Specifically, in Chromium on Ubuntu (but not Chrome
+"     on Windows). Perhaps it is font related?
+"   * Bug: still some gaps in the fold column when html_prevent_copy contains
+"     'd' and showing the whole diff (observed in multiple browsers). Only gaps
+"     on diff lines though.
+"   * anchors on each line so you can do file.html#1234 to get to line 1234
+"   * add a modeline to the generated html to set nofoldenable or fdm=manual
+"     because syntax folding takes a terribly long time to work with the weird
+"     formatting the script does.
 "   * Options for generating the CSS in external style sheets. New :TOcss
 "     command to convert the current color scheme into a (mostly) generic CSS
 "     stylesheet which can be re-used. Alternate stylesheet support?
+"   * Undercurl support via CSS3, with fallback to dotted or something:
+"	https://groups.google.com/d/topic/vim_use/BzXA6He1pHg/discussion
+"   * Redo updates for modified default foldtext (v11) when/if the patch is
+"     accepted to modify it.
+"   * Test case +diff_one_file-dynamic_folds+expand_tabs-hover_unfold
+"		+ignore_conceal-ignore_folding+no_foldcolumn+no_pre+no_progress
+"		+number_lines-pre_wrap-use_css+use_xhtml+whole_filler.xhtml
+"     does not show the whole diff filler as it is supposed to.
+"   * Add option for not generating the hyperlink on stuff that looks like a
+"     URL? Or just color the link to fit with the colorscheme (and only special
+"     when hovering)?
+"   * Bug: when 'isprint' is wrong for the current encoding, will generate
+"     invalid content. Can/should anything be done about this? Maybe a separate
+"     plugin to correct 'isprint' based on encoding?
+"   * Check to see if the windows-125\d encodings actually work in Unix without
+"     the 8bit- prefix. Add prefix to autoload dictionaries for Unix if not.
+"   * Font auto-detection similar to
+"     http://www.vim.org/scripts/script.php?script_id=2384 but for a variety of
+"     platforms.
+"   * Error thrown when sourcing 2html.vim directly when plugins are not loaded.
 "   * Pull in code from http://www.vim.org/scripts/script.php?script_id=3113 :
 "	- listchars support
 "	- full-line background highlight
 "	- other?
-"   * Font auto-detection similar to
-"     http://www.vim.org/scripts/script.php?script_id=2384
-"   * Explicitly trigger IE8+ Standards Mode?
-"   * Make it so deleted lines in a diff don't create side-scrolling
+"   * Explicitly trigger IE8+ Standards Mode? Doesn't seem necessary yet.
+"   * Make it so deleted lines in a diff don't create side-scrolling (get it
+"     free with full-line background highlight above).
 "   * Restore open/closed folds and cursor position after processing each file
-"     with option not to restore for speed increase
-"   * Undercurl support via dotted bottom border?
+"     with option not to restore for speed increase.
 "   * Add extra meta info (generation time, etc.)?
 "   * Tidy up so we can use strict doctype in even more situations
 "   * Implementation detail: add threshold for writing the lines to the html
 "     buffer before we're done (5000 or so lines should do it)
 "   * TODO comments for code cleanup scattered throughout
-"
+"}}}
 
 if exists('g:loaded_2html_plugin')
   finish
 endif
-let g:loaded_2html_plugin = 'vim7.3_v10'
+let g:loaded_2html_plugin = 'vim7.3_v12'
 
 "
-" Changelog:
-"   7.3_v10 (this version): Fix error E684 when converting a range wholly inside
+" Changelog: {{{
+"
+"   7.3_v12 (this version): Fix modeline mangling to also work for when multiple
+"                           highlight groups make up the start-of-modeline text.
+"                           Improve render time of page with uncopyable regions
+"                           by not using one-input-per-char. Change name of
+"                           uncopyable option from html_unselectable to
+"                           html_prevent_copy. Added html_no_invalid option and
+"                           default to inserting invalid markup for uncopyable
+"                           regions to prevent MS Word from pasting undeletable
+"                           <input> elements. Fix 'cpo' handling (Thilo Six).
+"                7.3_v12b1: Add html_unselectable option. Rework logic to
+"                           eliminate post-processing substitute commands in
+"                           favor of doing the work up front. Remove unnecessary
+"                           special treatment of 'LineNr' highlight group. Minor
+"                           speed improvements. Fix modeline mangling in
+"                           generated output so it works for text in the first
+"                           column. Fix missing line number and fold column in
+"                           diff filler lines. Fix that some fonts have a 1px
+"                           gap (using a dirty hack, improvements welcome). Add
+"                           "colorscheme" meta tag. Does NOT include support for
+"                           the new default foldtext added in v11, as the patch
+"                           adding it has not yet been included in Vim.
+"   7.3_v11 ( unreleased ): Support new default foldtext from patch by Christian
+"                           Brabandt in
+"                           http://groups.google.com/d/topic/vim_dev/B6FSGfq9VoI/discussion.
+"                           This patch has not yet been included in Vim, thus
+"                           these changes are removed in the next version.
+"   7.3_v10 (fd09a9c8468e): Fix error E684 when converting a range wholly inside
 "                           multiple nested folds with dynamic folding on.
 "                           Also fix problem with foldtext in this situation.
 "   7.3_v9  (0877b8d6370e): Add html_pre_wrap option active with html_use_css
@@ -81,14 +136,15 @@ let g:loaded_2html_plugin = 'vim7.3_v10'
 "                           diff colors and the normal syntax colors
 "   7.3_v1  (e7751177126b): Add conceal support and meta tags in output
 "   Pre-v1 baseline: Mercurial changeset 3c9324c0800e
+"}}}
 
 " Define the :TOhtml command when:
 " - 'compatible' is not set
 " - this plugin was not already loaded
-" - user commands are available.
+" - user commands are available. {{{
 if !&cp && !exists(":TOhtml") && has("user_commands")
   command -range=% TOhtml :call tohtml#Convert2HTML(<line1>, <line2>)
-endif
+endif "}}}
 
 " Make sure any patches will probably use consistent indent
-"   vim: ts=8 sw=2 sts=2 noet
+"   vim: ts=8 sw=2 sts=2 noet fdm=marker
--- a/runtime/syntax/2html.vim
+++ b/runtime/syntax/2html.vim
@@ -1,6 +1,6 @@
 " Vim syntax support file
 " Maintainer: Ben Fritz <fritzophrenic@gmail.com>
-" Last Change: 2011 May 27
+" Last Change: 2012 Jun 30
 "
 " Additional contributors:
 "
@@ -20,7 +20,7 @@
 " this file uses line continuations
 let s:cpo_sav = &cpo
 let s:ls  = &ls
-set cpo-=C
+set cpo&vim
 
 let s:end=line('$')
 
@@ -33,6 +33,17 @@ endif
 
 let s:settings = tohtml#GetUserSettings()
 
+if !exists('s:FOLDED_ID')
+  let s:FOLDED_ID  = hlID("Folded")     | lockvar s:FOLDED_ID
+  let s:FOLD_C_ID  = hlID("FoldColumn") | lockvar s:FOLD_C_ID
+  let s:LINENR_ID  = hlID('LineNr')     | lockvar s:LINENR_ID
+  let s:DIFF_D_ID  = hlID("DiffDelete") | lockvar s:DIFF_D_ID
+  let s:DIFF_A_ID  = hlID("DiffAdd")    | lockvar s:DIFF_A_ID
+  let s:DIFF_C_ID  = hlID("DiffChange") | lockvar s:DIFF_C_ID
+  let s:DIFF_T_ID  = hlID("DiffText")   | lockvar s:DIFF_T_ID
+  let s:CONCEAL_ID = hlID('Conceal')    | lockvar s:CONCEAL_ID
+endif
+
 " Whitespace
 if s:settings.pre_wrap
   let s:whitespace = "white-space: pre-wrap; "
@@ -40,26 +51,137 @@ else
   let s:whitespace = ""
 endif
 
+if !empty(s:settings.prevent_copy)
+  if s:settings.no_invalid
+    " User has decided they don't want invalid markup. Still works in
+    " OpenOffice, and for text editors, but when pasting into Microsoft Word the
+    " input elements get pasted too and they cannot be deleted (at least not
+    " easily).
+    let s:unselInputType = ""
+  else
+    " Prevent from copy-pasting the input elements into Microsoft Word where
+    " they cannot be deleted easily by deliberately inserting invalid markup.
+    let s:unselInputType = " type='invalid_input_type'"
+  endif
+endif
+
 " When not in gui we can only guess the colors.
+" TODO - is this true anymore?
 if has("gui_running")
   let s:whatterm = "gui"
 else
   let s:whatterm = "cterm"
   if &t_Co == 8
-    let s:cterm_color = {0: "#808080", 1: "#ff6060", 2: "#00ff00", 3: "#ffff00", 4: "#8080ff", 5: "#ff40ff", 6: "#00ffff", 7: "#ffffff"}
+    let s:cterm_color = {
+	    \   0: "#808080", 1: "#ff6060", 2: "#00ff00", 3: "#ffff00",
+	    \   4: "#8080ff", 5: "#ff40ff", 6: "#00ffff", 7: "#ffffff"
+	    \ }
   else
-    let s:cterm_color = {0: "#000000", 1: "#c00000", 2: "#008000", 3: "#804000", 4: "#0000c0", 5: "#c000c0", 6: "#008080", 7: "#c0c0c0", 8: "#808080", 9: "#ff6060", 10: "#00ff00", 11: "#ffff00", 12: "#8080ff", 13: "#ff40ff", 14: "#00ffff", 15: "#ffffff"}
+    let s:cterm_color = {
+	    \   0: "#000000", 1: "#c00000", 2: "#008000", 3: "#804000", 
+	    \   4: "#0000c0", 5: "#c000c0", 6: "#008080", 7: "#c0c0c0", 
+	    \   8: "#808080", 9: "#ff6060", 10: "#00ff00", 11: "#ffff00",
+	    \   12: "#8080ff", 13: "#ff40ff", 14: "#00ffff", 15: "#ffffff"
+	    \ }
 
     " Colors for 88 and 256 come from xterm.
     if &t_Co == 88
-      call extend(s:cterm_color, {16: "#000000", 17: "#00008b", 18: "#0000cd", 19: "#0000ff", 20: "#008b00", 21: "#008b8b", 22: "#008bcd", 23: "#008bff", 24: "#00cd00", 25: "#00cd8b", 26: "#00cdcd", 27: "#00cdff", 28: "#00ff00", 29: "#00ff8b", 30: "#00ffcd", 31: "#00ffff", 32: "#8b0000", 33: "#8b008b", 34: "#8b00cd", 35: "#8b00ff", 36: "#8b8b00", 37: "#8b8b8b", 38: "#8b8bcd", 39: "#8b8bff", 40: "#8bcd00", 41: "#8bcd8b", 42: "#8bcdcd", 43: "#8bcdff", 44: "#8bff00", 45: "#8bff8b", 46: "#8bffcd", 47: "#8bffff", 48: "#cd0000", 49: "#cd008b", 50: "#cd00cd", 51: "#cd00ff", 52: "#cd8b00", 53: "#cd8b8b", 54: "#cd8bcd", 55: "#cd8bff", 56: "#cdcd00", 57: "#cdcd8b", 58: "#cdcdcd", 59: "#cdcdff", 60: "#cdff00", 61: "#cdff8b", 62: "#cdffcd", 63: "#cdffff", 64: "#ff0000"})
-      call extend(s:cterm_color, {65: "#ff008b", 66: "#ff00cd", 67: "#ff00ff", 68: "#ff8b00", 69: "#ff8b8b", 70: "#ff8bcd", 71: "#ff8bff", 72: "#ffcd00", 73: "#ffcd8b", 74: "#ffcdcd", 75: "#ffcdff", 76: "#ffff00", 77: "#ffff8b", 78: "#ffffcd", 79: "#ffffff", 80: "#2e2e2e", 81: "#5c5c5c", 82: "#737373", 83: "#8b8b8b", 84: "#a2a2a2", 85: "#b9b9b9", 86: "#d0d0d0", 87: "#e7e7e7"})
+      call extend(s:cterm_color, {
+	    \   16: "#000000", 17: "#00008b", 18: "#0000cd", 19: "#0000ff",
+	    \   20: "#008b00", 21: "#008b8b", 22: "#008bcd", 23: "#008bff",
+	    \   24: "#00cd00", 25: "#00cd8b", 26: "#00cdcd", 27: "#00cdff",
+	    \   28: "#00ff00", 29: "#00ff8b", 30: "#00ffcd", 31: "#00ffff",
+	    \   32: "#8b0000", 33: "#8b008b", 34: "#8b00cd", 35: "#8b00ff",
+	    \   36: "#8b8b00", 37: "#8b8b8b", 38: "#8b8bcd", 39: "#8b8bff",
+	    \   40: "#8bcd00", 41: "#8bcd8b", 42: "#8bcdcd", 43: "#8bcdff",
+	    \   44: "#8bff00", 45: "#8bff8b", 46: "#8bffcd", 47: "#8bffff",
+	    \   48: "#cd0000", 49: "#cd008b", 50: "#cd00cd", 51: "#cd00ff",
+	    \   52: "#cd8b00", 53: "#cd8b8b", 54: "#cd8bcd", 55: "#cd8bff",
+	    \   56: "#cdcd00", 57: "#cdcd8b", 58: "#cdcdcd", 59: "#cdcdff",
+	    \   60: "#cdff00", 61: "#cdff8b", 62: "#cdffcd", 63: "#cdffff",
+	    \   64: "#ff0000"
+	    \ })
+      call extend(s:cterm_color, {
+	    \   65: "#ff008b", 66: "#ff00cd", 67: "#ff00ff", 68: "#ff8b00",
+	    \   69: "#ff8b8b", 70: "#ff8bcd", 71: "#ff8bff", 72: "#ffcd00",
+	    \   73: "#ffcd8b", 74: "#ffcdcd", 75: "#ffcdff", 76: "#ffff00",
+	    \   77: "#ffff8b", 78: "#ffffcd", 79: "#ffffff", 80: "#2e2e2e",
+	    \   81: "#5c5c5c", 82: "#737373", 83: "#8b8b8b", 84: "#a2a2a2",
+	    \   85: "#b9b9b9", 86: "#d0d0d0", 87: "#e7e7e7"
+	    \ })
     elseif &t_Co == 256
-      call extend(s:cterm_color, {16: "#000000", 17: "#00005f", 18: "#000087", 19: "#0000af", 20: "#0000d7", 21: "#0000ff", 22: "#005f00", 23: "#005f5f", 24: "#005f87", 25: "#005faf", 26: "#005fd7", 27: "#005fff", 28: "#008700", 29: "#00875f", 30: "#008787", 31: "#0087af", 32: "#0087d7", 33: "#0087ff", 34: "#00af00", 35: "#00af5f", 36: "#00af87", 37: "#00afaf", 38: "#00afd7", 39: "#00afff", 40: "#00d700", 41: "#00d75f", 42: "#00d787", 43: "#00d7af", 44: "#00d7d7", 45: "#00d7ff", 46: "#00ff00", 47: "#00ff5f", 48: "#00ff87", 49: "#00ffaf", 50: "#00ffd7", 51: "#00ffff", 52: "#5f0000", 53: "#5f005f", 54: "#5f0087", 55: "#5f00af", 56: "#5f00d7", 57: "#5f00ff", 58: "#5f5f00", 59: "#5f5f5f", 60: "#5f5f87", 61: "#5f5faf", 62: "#5f5fd7", 63: "#5f5fff", 64: "#5f8700"})
-      call extend(s:cterm_color, {65: "#5f875f", 66: "#5f8787", 67: "#5f87af", 68: "#5f87d7", 69: "#5f87ff", 70: "#5faf00", 71: "#5faf5f", 72: "#5faf87", 73: "#5fafaf", 74: "#5fafd7", 75: "#5fafff", 76: "#5fd700", 77: "#5fd75f", 78: "#5fd787", 79: "#5fd7af", 80: "#5fd7d7", 81: "#5fd7ff", 82: "#5fff00", 83: "#5fff5f", 84: "#5fff87", 85: "#5fffaf", 86: "#5fffd7", 87: "#5fffff", 88: "#870000", 89: "#87005f", 90: "#870087", 91: "#8700af", 92: "#8700d7", 93: "#8700ff", 94: "#875f00", 95: "#875f5f", 96: "#875f87", 97: "#875faf", 98: "#875fd7", 99: "#875fff", 100: "#878700", 101: "#87875f", 102: "#878787", 103: "#8787af", 104: "#8787d7", 105: "#8787ff", 106: "#87af00", 107: "#87af5f", 108: "#87af87", 109: "#87afaf", 110: "#87afd7", 111: "#87afff", 112: "#87d700"})
-      call extend(s:cterm_color, {113: "#87d75f", 114: "#87d787", 115: "#87d7af", 116: "#87d7d7", 117: "#87d7ff", 118: "#87ff00", 119: "#87ff5f", 120: "#87ff87", 121: "#87ffaf", 122: "#87ffd7", 123: "#87ffff", 124: "#af0000", 125: "#af005f", 126: "#af0087", 127: "#af00af", 128: "#af00d7", 129: "#af00ff", 130: "#af5f00", 131: "#af5f5f", 132: "#af5f87", 133: "#af5faf", 134: "#af5fd7", 135: "#af5fff", 136: "#af8700", 137: "#af875f", 138: "#af8787", 139: "#af87af", 140: "#af87d7", 141: "#af87ff", 142: "#afaf00", 143: "#afaf5f", 144: "#afaf87", 145: "#afafaf", 146: "#afafd7", 147: "#afafff", 148: "#afd700", 149: "#afd75f", 150: "#afd787", 151: "#afd7af", 152: "#afd7d7", 153: "#afd7ff", 154: "#afff00", 155: "#afff5f", 156: "#afff87", 157: "#afffaf", 158: "#afffd7"})
-      call extend(s:cterm_color, {159: "#afffff", 160: "#d70000", 161: "#d7005f", 162: "#d70087", 163: "#d700af", 164: "#d700d7", 165: "#d700ff", 166: "#d75f00", 167: "#d75f5f", 168: "#d75f87", 169: "#d75faf", 170: "#d75fd7", 171: "#d75fff", 172: "#d78700", 173: "#d7875f", 174: "#d78787", 175: "#d787af", 176: "#d787d7", 177: "#d787ff", 178: "#d7af00", 179: "#d7af5f", 180: "#d7af87", 181: "#d7afaf", 182: "#d7afd7", 183: "#d7afff", 184: "#d7d700", 185: "#d7d75f", 186: "#d7d787", 187: "#d7d7af", 188: "#d7d7d7", 189: "#d7d7ff", 190: "#d7ff00", 191: "#d7ff5f", 192: "#d7ff87", 193: "#d7ffaf", 194: "#d7ffd7", 195: "#d7ffff", 196: "#ff0000", 197: "#ff005f", 198: "#ff0087", 199: "#ff00af", 200: "#ff00d7", 201: "#ff00ff", 202: "#ff5f00", 203: "#ff5f5f", 204: "#ff5f87"})
-      call extend(s:cterm_color, {205: "#ff5faf", 206: "#ff5fd7", 207: "#ff5fff", 208: "#ff8700", 209: "#ff875f", 210: "#ff8787", 211: "#ff87af", 212: "#ff87d7", 213: "#ff87ff", 214: "#ffaf00", 215: "#ffaf5f", 216: "#ffaf87", 217: "#ffafaf", 218: "#ffafd7", 219: "#ffafff", 220: "#ffd700", 221: "#ffd75f", 222: "#ffd787", 223: "#ffd7af", 224: "#ffd7d7", 225: "#ffd7ff", 226: "#ffff00", 227: "#ffff5f", 228: "#ffff87", 229: "#ffffaf", 230: "#ffffd7", 231: "#ffffff", 232: "#080808", 233: "#121212", 234: "#1c1c1c", 235: "#262626", 236: "#303030", 237: "#3a3a3a", 238: "#444444", 239: "#4e4e4e", 240: "#585858", 241: "#626262", 242: "#6c6c6c", 243: "#767676", 244: "#808080", 245: "#8a8a8a", 246: "#949494", 247: "#9e9e9e", 248: "#a8a8a8", 249: "#b2b2b2", 250: "#bcbcbc", 251: "#c6c6c6", 252: "#d0d0d0", 253: "#dadada", 254: "#e4e4e4", 255: "#eeeeee"})
+      call extend(s:cterm_color, {
+	    \   16: "#000000", 17: "#00005f", 18: "#000087", 19: "#0000af",
+	    \   20: "#0000d7", 21: "#0000ff", 22: "#005f00", 23: "#005f5f",
+	    \   24: "#005f87", 25: "#005faf", 26: "#005fd7", 27: "#005fff",
+	    \   28: "#008700", 29: "#00875f", 30: "#008787", 31: "#0087af",
+	    \   32: "#0087d7", 33: "#0087ff", 34: "#00af00", 35: "#00af5f",
+	    \   36: "#00af87", 37: "#00afaf", 38: "#00afd7", 39: "#00afff",
+	    \   40: "#00d700", 41: "#00d75f", 42: "#00d787", 43: "#00d7af",
+	    \   44: "#00d7d7", 45: "#00d7ff", 46: "#00ff00", 47: "#00ff5f",
+	    \   48: "#00ff87", 49: "#00ffaf", 50: "#00ffd7", 51: "#00ffff",
+	    \   52: "#5f0000", 53: "#5f005f", 54: "#5f0087", 55: "#5f00af",
+	    \   56: "#5f00d7", 57: "#5f00ff", 58: "#5f5f00", 59: "#5f5f5f",
+	    \   60: "#5f5f87", 61: "#5f5faf", 62: "#5f5fd7", 63: "#5f5fff",
+	    \   64: "#5f8700"
+	    \ })
+      call extend(s:cterm_color, {
+	    \   65: "#5f875f", 66: "#5f8787", 67: "#5f87af", 68: "#5f87d7",
+	    \   69: "#5f87ff", 70: "#5faf00", 71: "#5faf5f", 72: "#5faf87",
+	    \   73: "#5fafaf", 74: "#5fafd7", 75: "#5fafff", 76: "#5fd700",
+	    \   77: "#5fd75f", 78: "#5fd787", 79: "#5fd7af", 80: "#5fd7d7",
+	    \   81: "#5fd7ff", 82: "#5fff00", 83: "#5fff5f", 84: "#5fff87",
+	    \   85: "#5fffaf", 86: "#5fffd7", 87: "#5fffff", 88: "#870000",
+	    \   89: "#87005f", 90: "#870087", 91: "#8700af", 92: "#8700d7",
+	    \   93: "#8700ff", 94: "#875f00", 95: "#875f5f", 96: "#875f87",
+	    \   97: "#875faf", 98: "#875fd7", 99: "#875fff", 100: "#878700",
+	    \   101: "#87875f", 102: "#878787", 103: "#8787af", 104: "#8787d7",
+	    \   105: "#8787ff", 106: "#87af00", 107: "#87af5f", 108: "#87af87",
+	    \   109: "#87afaf", 110: "#87afd7", 111: "#87afff", 112: "#87d700"
+	    \ })
+      call extend(s:cterm_color, {
+	    \   113: "#87d75f", 114: "#87d787", 115: "#87d7af", 116: "#87d7d7",
+	    \   117: "#87d7ff", 118: "#87ff00", 119: "#87ff5f", 120: "#87ff87",
+	    \   121: "#87ffaf", 122: "#87ffd7", 123: "#87ffff", 124: "#af0000",
+	    \   125: "#af005f", 126: "#af0087", 127: "#af00af", 128: "#af00d7",
+	    \   129: "#af00ff", 130: "#af5f00", 131: "#af5f5f", 132: "#af5f87",
+	    \   133: "#af5faf", 134: "#af5fd7", 135: "#af5fff", 136: "#af8700",
+	    \   137: "#af875f", 138: "#af8787", 139: "#af87af", 140: "#af87d7",
+	    \   141: "#af87ff", 142: "#afaf00", 143: "#afaf5f", 144: "#afaf87",
+	    \   145: "#afafaf", 146: "#afafd7", 147: "#afafff", 148: "#afd700",
+	    \   149: "#afd75f", 150: "#afd787", 151: "#afd7af", 152: "#afd7d7",
+	    \   153: "#afd7ff", 154: "#afff00", 155: "#afff5f", 156: "#afff87",
+	    \   157: "#afffaf", 158: "#afffd7"
+	    \ })
+      call extend(s:cterm_color, {
+	    \   159: "#afffff", 160: "#d70000", 161: "#d7005f", 162: "#d70087",
+	    \   163: "#d700af", 164: "#d700d7", 165: "#d700ff", 166: "#d75f00",
+	    \   167: "#d75f5f", 168: "#d75f87", 169: "#d75faf", 170: "#d75fd7",
+	    \   171: "#d75fff", 172: "#d78700", 173: "#d7875f", 174: "#d78787",
+	    \   175: "#d787af", 176: "#d787d7", 177: "#d787ff", 178: "#d7af00",
+	    \   179: "#d7af5f", 180: "#d7af87", 181: "#d7afaf", 182: "#d7afd7",
+	    \   183: "#d7afff", 184: "#d7d700", 185: "#d7d75f", 186: "#d7d787",
+	    \   187: "#d7d7af", 188: "#d7d7d7", 189: "#d7d7ff", 190: "#d7ff00",
+	    \   191: "#d7ff5f", 192: "#d7ff87", 193: "#d7ffaf", 194: "#d7ffd7",
+	    \   195: "#d7ffff", 196: "#ff0000", 197: "#ff005f", 198: "#ff0087",
+	    \   199: "#ff00af", 200: "#ff00d7", 201: "#ff00ff", 202: "#ff5f00",
+	    \   203: "#ff5f5f", 204: "#ff5f87"
+	    \ })
+      call extend(s:cterm_color, {
+	    \   205: "#ff5faf", 206: "#ff5fd7", 207: "#ff5fff", 208: "#ff8700",
+	    \   209: "#ff875f", 210: "#ff8787", 211: "#ff87af", 212: "#ff87d7",
+	    \   213: "#ff87ff", 214: "#ffaf00", 215: "#ffaf5f", 216: "#ffaf87",
+	    \   217: "#ffafaf", 218: "#ffafd7", 219: "#ffafff", 220: "#ffd700",
+	    \   221: "#ffd75f", 222: "#ffd787", 223: "#ffd7af", 224: "#ffd7d7",
+	    \   225: "#ffd7ff", 226: "#ffff00", 227: "#ffff5f", 228: "#ffff87",
+	    \   229: "#ffffaf", 230: "#ffffd7", 231: "#ffffff", 232: "#080808",
+	    \   233: "#121212", 234: "#1c1c1c", 235: "#262626", 236: "#303030",
+	    \   237: "#3a3a3a", 238: "#444444", 239: "#4e4e4e", 240: "#585858",
+	    \   241: "#626262", 242: "#6c6c6c", 243: "#767676", 244: "#808080",
+	    \   245: "#8a8a8a", 246: "#949494", 247: "#9e9e9e", 248: "#a8a8a8",
+	    \   249: "#b2b2b2", 250: "#bcbcbc", 251: "#c6c6c6", 252: "#d0d0d0",
+	    \   253: "#dadada", 254: "#e4e4e4", 255: "#eeeeee"
+	    \ })
     endif
   endif
 endif
@@ -80,6 +202,16 @@ else
   endfun
 endif
 
+" Find out the background and foreground color for use later
+let s:fgc = s:HtmlColor(synIDattr(hlID("Normal"), "fg#", s:whatterm))
+let s:bgc = s:HtmlColor(synIDattr(hlID("Normal"), "bg#", s:whatterm))
+if s:fgc == ""
+  let s:fgc = ( &background == "dark" ? "#ffffff" : "#000000" )
+endif
+if s:bgc == ""
+  let s:bgc = ( &background == "dark" ? "#000000" : "#ffffff" )
+endif
+
 if !s:settings.use_css
   " Return opening HTML tag for given highlight id
   function! s:HtmlOpening(id)
@@ -120,30 +252,193 @@ if !s:settings.use_css
   endfun
 endif
 
+" Use a different function for formatting based on user options. This way we
+" can avoid a lot of logic during the actual execution.
+"
+" Build the function line by line containing only what is needed for the options
+" in use for maximum code sharing with minimal branch logic for greater speed.
+"
+" Note, 'exec' commands do not recognize line continuations, so must concatenate
+" lines rather than continue them.
+if s:settings.use_css
+  " save CSS to a list of rules to add to the output at the end of processing
+
+  " first, get the style names we need
+  let wrapperfunc_lines = [
+	\ 'function! s:BuildStyleWrapper(style_id, diff_style_id, text, make_unselectable, unformatted)',
+	\ '',
+	\ '  let l:style_name = synIDattr(a:style_id, "name", s:whatterm)'
+	\ ]
+  if &diff
+    let wrapperfunc_lines += [
+	\ '  let l:diff_style_name = synIDattr(a:diff_style_id, "name", s:whatterm)']
+
+  " Add normal groups and diff groups to separate lists so we can order them to
+  " allow diff highlight to override normal highlight
+
+  " if primary style IS a diff style, grab it from the diff cache instead
+  " (always succeeds because we pre-populate it)
+  let wrapperfunc_lines += [
+	\ '',
+	\ '  if a:style_id == s:DIFF_D_ID || a:style_id == s:DIFF_A_ID ||'.
+	\ '          a:style_id == s:DIFF_C_ID || a:style_id == s:DIFF_T_ID',
+	\ '    let l:saved_style = get(s:diffstylelist,a:style_id)',
+	\ '  else'
+	\ ]
+  endif
+
+  " get primary style info from cache or build it on the fly if not found
+  let wrapperfunc_lines += [
+	\ '    let l:saved_style = get(s:stylelist,a:style_id)',
+	\ '    if type(l:saved_style) == type(0)',
+	\ '      unlet l:saved_style',
+	\ '      let l:saved_style = s:CSS1(a:style_id)',
+	\ '      if l:saved_style != ""',
+	\ '        let l:saved_style = "." . l:style_name . " { " . l:saved_style . "}"',
+	\ '      endif',
+	\ '      let s:stylelist[a:style_id]= l:saved_style',
+	\ '    endif'
+	\ ]
+  if &diff
+    let wrapperfunc_lines += [ '  endif' ]
+  endif
+
+  " Build the wrapper tags around the text. It turns out that caching these
+  " gives pretty much zero performance gain and adds a lot of logic.
+
+  let wrapperfunc_lines += [
+	\ '',
+	\ '  if l:saved_style == ""'
+	\ ]
+  if &diff
+    let wrapperfunc_lines += [
+	\ '    if a:diff_style_id <= 0'
+	\ ]
+  endif
+  " no surroundings if neither primary nor diff style has any info
+  let wrapperfunc_lines += [
+	\ '       return a:text'
+	\ ]
+  if &diff
+    " no primary style, but diff style
+    let wrapperfunc_lines += [
+	\ '     else',
+	\ '       return "<span class=\"" .l:diff_style_name . "\">".a:text."</span>"',
+	\ '     endif'
+	\ ]
+  endif
+  " open tag for non-empty primary style
+  let wrapperfunc_lines += [
+	\ '  else']
+  " non-empty primary style. handle either empty or non-empty diff style.
+  "
+  " separate the two classes by a space to apply them both if there is a diff
+  " style name, unless the primary style is empty, then just use the diff style
+  " name
+  let diffstyle =
+	  \ (&diff ? '(a:diff_style_id <= 0 ? "" : " ". l:diff_style_name) .'
+	  \        : "")
+  if s:settings.prevent_copy == ""
+    let wrapperfunc_lines += [
+	  \ '    return "<span class=\"" . l:style_name .'.diffstyle.'"\">".a:text."</span>"'
+	  \ ]
+  else
+
+    "
+    " Wrap the <input> in a <span> to allow fixing the stupid bug in some fonts
+    " which cause browsers to display a 1px gap between lines when these
+    " <input>s have a background color (maybe not really a bug, this isn't
+    " well-defined)
+    "
+    " use strwidth, because we care only about how many character boxes are
+    " needed to size the input, we don't care how many characters (including
+    " separately counted composing chars, from strchars()) or bytes (from
+    " len())the string contains. strdisplaywidth() is not needed because none of
+    " the unselectable groups can contain tab characters (fold column, fold
+    " text, line number).
+    "
+    " Note, if maxlength property needs to be added in the future, it will need
+    " to use strchars(), because HTML specifies that the maxlength parameter
+    " uses the number of unique codepoints for its limit.
+    let wrapperfunc_lines += [
+	  \ '    if a:make_unselectable',
+	  \ '      return "<span class=\"" . l:style_name .'.diffstyle.'"\">'.
+	  \                '<input'.s:unselInputType.' class=\"" . l:style_name .'.diffstyle.'"\"'.
+	  \                 ' value=\"".substitute(a:unformatted,''\s\+$'',"","")."\"'.
+	  \                 ' onselect=''this.blur(); return false;'''.
+	  \                 ' onmousedown=''this.blur(); return false;'''.
+	  \                 ' onclick=''this.blur(); return false;'''.
+	  \                 ' readonly=''readonly'''.
+	  \                 ' size=\"".strwidth(a:unformatted)."\"'.
+	  \                 (s:settings.use_xhtml ? '/' : '').'></span>"',
+	  \ '    else',
+	  \ '      return "<span class=\"" . l:style_name .'. diffstyle .'"\">".a:text."</span>"'
+	  \ ]
+  endif
+  " close off tag for non-empty primary style
+  if s:settings.prevent_copy == ""
+    let wrapperfunc_lines[-1] .=
+	  \ '                     "\">".a:text."</span>"'
+  else
+    let wrapperfunc_lines[-1] .=
+	  \ '                     "\">".a:text."</span>"'
+  endif
+  let wrapperfunc_lines += [
+	\ '  endif',
+	\ 'endfun'
+	\ ]
+else
+  " Non-CSS method just needs the wrapper.
+  "
+  " Functions used to get opening/closing automatically return null strings if
+  " no styles exist.
+  if &diff
+    let wrapperfunc_lines = [
+	  \ 'function! s:BuildStyleWrapper(style_id, diff_style_id, text, unusedarg, unusedarg2)',
+	  \ '  return s:HtmlOpening(a:style_id).(a:diff_style_id <= 0 ? "" :'.
+	  \                                     's:HtmlOpening(a:diff_style_id)).a:text.'.
+	  \   '(a:diff_style_id <= 0 ? "" : s:HtmlClosing(a:diff_style_id)).s:HtmlClosing(a:style_id)',
+	  \ 'endfun'
+	  \ ]
+  else
+    let wrapperfunc_lines = [
+	  \ 'function! s:BuildStyleWrapper(style_id, diff_style_id, text, unusedarg, unusedarg2)',
+	  \ '  return s:HtmlOpening(a:style_id).a:text.s:HtmlClosing(a:style_id)',
+	  \ 'endfun'
+	  \ ]
+  endif
+endif
+
+" create the function we built line by line above
+exec join(wrapperfunc_lines, "\n")
+
+let s:diff_mode = &diff
+
 " Return HTML valid characters enclosed in a span of class style_name with
 " unprintable characters expanded and double spaces replaced as necessary.
-function! s:HtmlFormat(text, style_name, diff_style_name)
+"
+" TODO: eliminate unneeded logic like done for BuildStyleWrapper
+function! s:HtmlFormat(text, style_id, diff_style_id, make_unselectable)
   " Replace unprintable characters
-  let formatted = strtrans(a:text)
+  let unformatted = strtrans(a:text)
 
-  " separate the two classes by a space to apply them both if there is a diff
-  " style name
-  let l:style_name = a:style_name . (a:diff_style_name == '' ? '' : ' ') . a:diff_style_name
+  let formatted = unformatted
 
   " Replace the reserved html characters
   let formatted = substitute(formatted, '&', '\&amp;',  'g')
   let formatted = substitute(formatted, '<', '\&lt;',   'g')
   let formatted = substitute(formatted, '>', '\&gt;',   'g')
   let formatted = substitute(formatted, '"', '\&quot;', 'g')
-  " TODO: Use &apos; for "'"?
+  " &apos; is not valid in HTML but it is in XHTML, so just use the numeric
+  " reference for it instead. Needed because it could appear in quotes
+  " especially if unselectable regions is turned on.
+  let formatted = substitute(formatted, '"', '\&#0039;', 'g')
 
   " Replace a "form feed" character with HTML to do a page break
+  " TODO: need to prevent this in unselectable areas? Probably it should never
+  " BE in an unselectable area...
   let formatted = substitute(formatted, "\x0c", '<hr class="PAGE-BREAK">', 'g')
 
-  " Mangle modelines so Vim doesn't try to use HTML text as a modeline if
-  " editing this file in the future
-  let formatted = substitute(formatted, '\v(\s+%(vim?|ex)):', '\1\&#0058;', 'g')
-
   " Replace double spaces, leading spaces, and trailing spaces if needed
   if ' ' != s:HtmlSpace
     let formatted = substitute(formatted, '  ', s:HtmlSpace . s:HtmlSpace, 'g')
@@ -151,31 +446,85 @@ function! s:HtmlFormat(text, style_name,
     let formatted = substitute(formatted, ' \+$', s:HtmlSpace, 'g')
   endif
 
-  " Enclose in a span of class style_name
-  let formatted = '<span class="' . l:style_name . '">' . formatted . '</span>'
+  " Enclose in the correct format
+  return s:BuildStyleWrapper(a:style_id, a:diff_style_id, formatted, a:make_unselectable, unformatted)
+endfun
 
-  " Add the class to class list if it's not there yet.
-  " Add normal groups to the beginning so diff groups can override them.
-  let s:id = hlID(a:style_name)
-  if index(s:idlist, s:id ) == -1
-    if a:style_name =~ 'Diff\%(Add\|Change\|Delete\|Text\)'
-      call add(s:idlist, s:id)
-    else
-      call insert(s:idlist, s:id)
-    endif
+" set up functions to call HtmlFormat in certain ways based on whether the
+" element is supposed to be unselectable or not
+if s:settings.prevent_copy =~# 'n'
+  function! s:HtmlFormat_n(text, style_id, diff_style_id)
+    return s:HtmlFormat(a:text, a:style_id, a:diff_style_id, 1)
+  endfun
+else
+  function! s:HtmlFormat_n(text, style_id, diff_style_id)
+    return s:HtmlFormat(a:text, a:style_id, a:diff_style_id, 0)
+  endfun
+endif
+if s:settings.prevent_copy =~# 'd'
+  function! s:HtmlFormat_d(text, style_id, diff_style_id)
+    return s:HtmlFormat(a:text, a:style_id, a:diff_style_id, 1)
+  endfun
+else
+  function! s:HtmlFormat_d(text, style_id, diff_style_id)
+    return s:HtmlFormat(a:text, a:style_id, a:diff_style_id, 0)
+  endfun
+endif
+if s:settings.prevent_copy =~# 'f'
+  " Note the <input> elements for fill spaces will have a single space for
+  " content, to allow active cursor CSS selection to work.
+  "
+  " Wrap the whole thing in a span for the 1px padding workaround for gaps.
+  function! s:FoldColumn_build(char, len, numfill, char2, class, click)
+    let l:input_open = "<input readonly='readonly'".s:unselInputType.
+	  \ " onselect='this.blur(); return false;'".
+	  \ " onmousedown='this.blur(); ".a:click." return false;'".
+	  \ " onclick='return false;' size='".
+	  \ string(a:len + (empty(a:char2) ? 0 : 1) + a:numfill) .
+	  \ "' "
+    let l:common_attrs = "class='FoldColumn' value='"
+    let l:input_close = (s:settings.use_xhtml ? "' />" : "'>")
+    return "<span class='".a:class."'>".
+	  \ l:input_open.l:common_attrs.repeat(a:char, a:len).
+	  \ (!empty(a:char2) ? a:char2 : "").
+	  \ l:input_close . "</span>"
+  endfun
+  function! s:FoldColumn_fill()
+    return s:FoldColumn_build('', s:foldcolumn, 0, '', 'FoldColumn', '')
+  endfun
+else
+  " For normal fold columns, simply space-pad to the desired width (note that
+  " the FoldColumn definition includes a whitespace:pre rule)
+  function! s:FoldColumn_build(char, len, numfill, char2, class, click)
+    return "<a href='#' class='".a:class."' onclick='".a:click."'>".
+	  \ repeat(a:char, a:len).a:char2.repeat(' ', a:numfill).
+	  \ "</a>"
+  endfun
+  function! s:FoldColumn_fill()
+    return s:HtmlFormat(repeat(' ', s:foldcolumn), s:FOLD_C_ID, 0, 0)
+  endfun
+endif
+if s:settings.prevent_copy =~# 't'
+  " put an extra empty span at the end for dynamic folds, so the linebreak can
+  " be surrounded. Otherwise do it as normal.
+  "
+  " TODO: isn't there a better way to do this, than placing it here and using a
+  " substitute later?
+  if s:settings.dynamic_folds
+    function! s:HtmlFormat_t(text, style_id, diff_style_id)
+      return s:HtmlFormat(a:text, a:style_id, a:diff_style_id, 1) .
+	    \ s:HtmlFormat("", a:style_id, 0, 0)
+    endfun
+  else
+    function! s:HtmlFormat_t(text, style_id, diff_style_id)
+      return s:HtmlFormat(a:text, a:style_id, a:diff_style_id, 1)
+    endfun
   endif
-  
-  " Add the diff highlight class to class list if used and it's not there yet.
-  " Add diff groups to the end so they override the other highlighting.
-  if a:diff_style_name != ""
-    let s:diff_id = hlID(a:diff_style_name)
-    if index(s:idlist, s:diff_id) == -1
-      call add(s:idlist, s:diff_id)
-    endif
-  endif
-
-  return formatted
-endfun
+else
+  function! s:HtmlFormat_t(text, style_id, diff_style_id)
+    return s:HtmlFormat(a:text, a:style_id, a:diff_style_id, 0)
+  endfun
+endif
 
 " Return CSS style describing given highlight id (can be empty)
 function! s:CSS1(id)
@@ -190,7 +539,15 @@ function! s:CSS1(id)
     let x = s:HtmlColor(synIDattr(a:id, "fg#", s:whatterm))
     if x != "" | let a = a . "color: " . x . "; " | endif
     let x = s:HtmlColor(synIDattr(a:id, "bg#", s:whatterm))
-    if x != "" | let a = a . "background-color: " . x . "; " | endif
+    if x != ""
+      let a = a . "background-color: " . x . "; "
+      " stupid hack because almost every browser seems to have at least one font
+      " which shows 1px gaps between lines which have background
+      let a = a . "padding-bottom: 1px; "
+    elseif (a:id == s:FOLDED_ID || a:id == s:LINENR_ID || a:id == s:FOLD_C_ID) && !empty(s:settings.prevent_copy)
+      " input elements default to a different color than the rest of the page
+      let a = a . "background-color: " . s:bgc . "; "
+    endif
   endif
   if synIDattr(a:id, "bold") | let a = a . "font-weight: bold; " | endif
   if synIDattr(a:id, "italic") | let a = a . "font-style: italic; " | endif
@@ -336,7 +693,12 @@ call extend(s:lines, [
 call add(s:lines, '<meta name="syntax" content="'.s:current_syntax.'"'.s:tag_close)
 call add(s:lines, '<meta name="settings" content="'.
       \ join(filter(keys(s:settings),'s:settings[v:val]'),',').
+      \ ',prevent_copy='.s:settings.prevent_copy.
       \ '"'.s:tag_close)
+call add(s:lines, '<meta name="colorscheme" content="'.
+      \ (exists('g:colors_name')
+      \ ? g:colors_name
+      \ : 'none'). '"'.s:tag_close)
 
 if s:settings.use_css
   if s:settings.dynamic_folds
@@ -412,12 +774,18 @@ if s:settings.use_css
   endif
 endif
 
+" insert script tag if any javascript is needed
+if s:settings.dynamic_folds || s:settings.prevent_copy != ""
+  call extend(s:lines, [
+	\ "",
+	\ "<script type='text/javascript'>",
+	\ s:settings.use_xhtml ? '//<![CDATA[' : "<!--"])
+endif
+
 " insert javascript to toggle folds open and closed
 if s:settings.dynamic_folds
   call extend(s:lines, [
 	\ "",
-	\ "<script type='text/javascript'>",
-	\ s:settings.use_xhtml ? '//<![CDATA[' : "<!--",
 	\ "function toggleFold(objID)",
 	\ "{",
 	\ "  var fold;",
@@ -430,22 +798,114 @@ if s:settings.dynamic_folds
 	\ "  {",
 	\ "    fold.className = 'closed-fold';",
 	\ "  }",
-	\ "}",
-	\ s:settings.use_xhtml ? '//]]>' : '-->',
-	\ "</script>"
+	\ "}"
 	\])
 endif
 
+" Small text columns like the foldcolumn and line number column need a weird
+" hack to work around Webkit's and (in versions prior to 9) IE's lack of support
+" for the 'ch' unit without messing up Opera, which also doesn't support it but
+" works anyway.
+"
+" The problem is that without the 'ch' unit, it is not possible to specify a
+" size of an <input> in terms of character widths. Only Opera seems to do the
+" "sensible" thing and make the <input> sized to fit exactly as many characters
+" as specified by its "size" attribute, but the spec actually says "at least
+" wide enough to fit 'size' characters", so the other browsers are technically
+" correct as well.
+"
+" Anyway, this leads to two diffculties:
+"   1. The foldcolumn is made up of multiple elements side-by-side with
+"      different sizes, each of which has their own extra padding added. Thus, a
+"      column made up of one item of size 1 and another of size 2 would not
+"      necessarily be equal in size to another line's foldcolumn with a single
+"      item of size 3.
+"   2. The extra padding added to the <input> elements adds up to make the
+"      foldcolumn and line number column too wide, especially in Webkit
+"      browsers.
+"
+" So, the full workaround is:
+"   1. Define a default size in em, equal to the number of characters in the
+"      input element, in case javascript is disabled and the browser does not
+"      support the 'ch' unit. Unfortunately this makes Opera no longer work
+"      properly without javascript. 1em per character is much too wide but it
+"      looks better in webkit browsers than unaligned columns.
+"   2. Insert the following javascript to run at page load, which checks for the
+"      width of a single character (in an extraneous page element inserted
+"      before the page title, and set to hidden) and compares it to the width of
+"      another extra <input> element with only one character. If the width
+"      matches, the script does nothing more, but if not, it will figure out the
+"      fraction of an em unit which would correspond with a ch unit if there
+"      were one, and set the containing element (<pre> or <div>) to a class with
+"      pre-defined rules which is closest to that fraction of an em. Rules are
+"      defined from 0.05 em to 1em per ch.
+if !empty(s:settings.prevent_copy)
+  call extend(s:lines, [
+	\ '',
+	\ '/* simulate a "ch" unit by asking the browser how big a zero character is */',
+	\ 'function FixCharWidth() {',
+	\ '  /* get the hidden element which gives the width of a single character */',
+	\ '  var goodWidth = document.getElementById("oneCharWidth").clientWidth;',
+	\ '  /* get all input elements, we''ll filter on class later */',
+	\ '  var inputTags = document.getElementsByTagName("input");',
+	\ '  var ratio = 5;',
+	\ '  var inputWidth = document.getElementById("oneInputWidth").clientWidth;',
+	\ '  var emWidth = document.getElementById("oneEmWidth").clientWidth;',
+	\ '  if (inputWidth > goodWidth) {',
+	\ '    while (ratio < 100*goodWidth/emWidth && ratio < 100) {',
+	\ '    ratio += 5;',
+	\ '  }',
+	\ '  document.getElementById("vimCodeElement").className = "em"+ratio;',
+	\ '  }',
+	\ '}'
+	\ ])
+endif
+
+" insert script closing tag if any javascript is needed
+if s:settings.dynamic_folds || s:settings.prevent_copy != ""
+  call extend(s:lines, [
+	\ '',
+	\ s:settings.use_xhtml ? '//]]>' : '-->',
+	\ "</script>"
+	\ ])
+endif
+
+call extend(s:lines, ["</head>"])
+if !empty(s:settings.prevent_copy)
+  call extend(s:lines,
+	\ ["<body onload='FixCharWidth();'>",
+	\ "<!-- hidden divs used by javascript to get the width of a char -->",
+	\ "<div id='oneCharWidth'>0</div>",
+	\ "<div id='oneInputWidth'><input size='1' value='0'".s:tag_close."</div>",
+	\ "<div id='oneEmWidth' style='width: 1em;'></div>"
+	\ ])
+else
+  call extend(s:lines, ["<body>"])
+endif
 if s:settings.no_pre
-  call extend(s:lines, ["</head>", "<body>"])
+  " if we're not using CSS we use a font tag which can't have a div inside
+  if s:settings.use_css
+    call extend(s:lines, ["<div id='vimCodeElement'>"])
+  endif
 else
-  call extend(s:lines, ["</head>", "<body>", "<pre>"])
+  call extend(s:lines, ["<pre id='vimCodeElement'>"])
 endif
 
 exe s:orgwin . "wincmd w"
 
-" List of all id's
-let s:idlist = []
+" caches of style data
+" initialize to include line numbers if using them
+if s:settings.number_lines
+  let s:stylelist = { s:LINENR_ID : ".LineNr { " . s:CSS1( s:LINENR_ID ) . "}" }
+else
+  let s:stylelist = {}
+endif
+let s:diffstylelist = {
+      \   s:DIFF_A_ID : ".DiffAdd { " . s:CSS1( s:DIFF_A_ID ) . "}",
+      \   s:DIFF_C_ID : ".DiffChange { " . s:CSS1( s:DIFF_C_ID ) . "}",
+      \   s:DIFF_D_ID : ".DiffDelete { " . s:CSS1( s:DIFF_D_ID ) . "}",
+      \   s:DIFF_T_ID : ".DiffText { " . s:CSS1( s:DIFF_T_ID ) . "}"
+      \ }
 
 " set up progress bar in the status line
 if !s:settings.no_progress
@@ -772,15 +1232,22 @@ while s:lnum <= s:end
 
       if !s:settings.no_pre
 	" HTML line wrapping is off--go ahead and fill to the margin
+	" TODO: what about when CSS wrapping is turned on?
 	let s:new = s:new . repeat(s:difffillchar, &columns - strlen(s:new) - s:margin)
       else
 	let s:new = s:new . repeat(s:difffillchar, 3)
       endif
 
-      let s:new = s:HtmlFormat(s:new, "DiffDelete", "")
+      let s:new = s:HtmlFormat_d(s:new, s:DIFF_D_ID, 0)
       if s:settings.number_lines
-	" Indent if line numbering is on; must be after escaping.
-	let s:new = repeat(s:LeadingSpace, s:margin) . s:new
+	" Indent if line numbering is on. Indent gets style of line number
+	" column.
+	let s:new = s:HtmlFormat_n(repeat(' ', s:margin), s:LINENR_ID, 0) . s:new
+      endif
+      if s:settings.dynamic_folds && !s:settings.no_foldcolumn && s:foldcolumn > 0
+	" Indent for foldcolumn if there is one. Assume it's empty, there should
+	" not be a fold for deleted lines in diff mode.
+	let s:new = s:FoldColumn_fill() . s:new
       endif
       call add(s:lines, s:new.s:HtmlEndline)
 
@@ -793,8 +1260,6 @@ while s:lnum <= s:end
   " Start the line with the line number.
   if s:settings.number_lines
     let s:numcol = repeat(' ', s:margin - 1 - strlen(s:lnum)) . s:lnum . ' '
-  else
-    let s:numcol = ""
   endif
 
   let s:new = ""
@@ -802,14 +1267,14 @@ while s:lnum <= s:end
   if has('folding') && !s:settings.ignore_folding && foldclosed(s:lnum) > -1 && !s:settings.dynamic_folds
     "
     " This is the beginning of a folded block (with no dynamic folding)
-    "
-    let s:new = s:numcol . foldtextresult(s:lnum)
+    let s:new = foldtextresult(s:lnum)
     if !s:settings.no_pre
       " HTML line wrapping is off--go ahead and fill to the margin
       let s:new = s:new . repeat(s:foldfillchar, &columns - strlen(s:new))
     endif
 
-    let s:new = s:HtmlFormat(s:new, "Folded", "")
+    " put numcol in a separate group for sake of unselectable text
+    let s:new = (s:settings.number_lines ? s:HtmlFormat_n(s:numcol, s:FOLDED_ID, 0): "") . s:HtmlFormat_t(s:new, s:FOLDED_ID, 0)
 
     " Skip to the end of the fold
     let s:new_lnum = foldclosedend(s:lnum)
@@ -851,38 +1316,46 @@ while s:lnum <= s:end
 	if !s:settings.no_foldcolumn
 	  " add fold column that can open the new fold
 	  if s:allfolds[0].level > 1 && s:firstfold
-	    let s:new = s:new . "<a class='toggle-open FoldColumn' href='javascript:toggleFold(\"fold".s:foldstack[0].id."\")'>"
-	    let s:new = s:new . repeat('|', s:allfolds[0].level - 1) . "</a>"
+	    let s:new = s:new . s:FoldColumn_build('|', s:allfolds[0].level - 1, 0, "",
+		  \ 'toggle-open FoldColumn','javascript:toggleFold("fold'.s:foldstack[0].id.'");')
 	  endif
-	  let s:new = s:new . "<a class='toggle-open FoldColumn' href='javascript:toggleFold(\"fold".s:foldId."\")'>+</a>"
-	  let s:new = s:new . "<a class='toggle-open "
+	  " add the filler spaces separately from the '+' char so that it can be
+	  " shown/hidden separately during a hover unfold
+	  let s:new = s:new . s:FoldColumn_build("+", 1, 0, "",
+		\ 'toggle-open FoldColumn', 'javascript:toggleFold("fold'.s:foldId.'");')
 	  " If this is not the last fold we're opening on this line, we need
 	  " to keep the filler spaces hidden if the fold is opened by mouse
 	  " hover. If it is the last fold to open in the line, we shouldn't hide
 	  " them, so don't apply the toggle-filler class.
-	  if get(s:allfolds, 1, {'firstline': 0}).firstline == s:lnum
-	    let s:new = s:new . "toggle-filler "
-	  endif
-	  let s:new = s:new . "FoldColumn' href='javascript:toggleFold(\"fold".s:foldId."\")'>"
-	  let s:new = s:new . repeat(" ", s:foldcolumn - s:allfolds[0].level) . "</a>"
+	  let s:new = s:new . s:FoldColumn_build(" ", 1, s:foldcolumn - s:allfolds[0].level - 1, "",
+		\ 'toggle-open FoldColumn'. (get(s:allfolds, 1, {'firstline': 0}).firstline == s:lnum ?" toggle-filler" :""),
+		\ 'javascript:toggleFold("fold'.s:foldId.'");')
 
 	  " add fold column that can close the new fold
-	  let s:new = s:new . "<a class='toggle-closed FoldColumn' href='javascript:toggleFold(\"fold".s:foldId."\")'>"
-	  if s:firstfold
-	    let s:new = s:new . repeat('|', s:allfolds[0].level - 1)
+	  " only add extra blank space if we aren't opening another fold on the
+	  " same line
+	  if get(s:allfolds, 1, {'firstline': 0}).firstline != s:lnum
+	    let s:extra_space = s:foldcolumn - s:allfolds[0].level
+	  else
+	    let s:extra_space = 0
 	  endif
-	  let s:new = s:new . "-"
-	  " only add spaces if we aren't opening another fold on the same line
-	  if get(s:allfolds, 1, {'firstline': 0}).firstline != s:lnum
-	    let s:new = s:new . repeat(" ", s:foldcolumn - s:allfolds[0].level)
+	  if s:firstfold
+	    " the first fold in a line has '|' characters from folds opened in
+	    " previous lines, before the '-' for this fold
+	    let s:new .= s:FoldColumn_build('|', s:allfolds[0].level - 1, s:extra_space, '-',
+		  \ 'toggle-closed FoldColumn', 'javascript:toggleFold("fold'.s:foldId.'");')
+	  else
+	    " any subsequent folds in the line only add a single '-'
+	    let s:new = s:new . s:FoldColumn_build("-", 1, s:extra_space, "",
+		  \ 'toggle-closed FoldColumn', 'javascript:toggleFold("fold'.s:foldId.'");')
 	  endif
-	  let s:new = s:new . "</a>"
 	  let s:firstfold = 0
 	endif
 
-	" add fold text, moving the span ending to the next line so collapsing
-	" of folds works correctly
-	let s:new = s:new . substitute(s:HtmlFormat(s:numcol . foldtextresult(s:lnum), "Folded", ""), '</span>', s:HtmlEndline.'\n\0', '')
+	" Add fold text, moving the span ending to the next line so collapsing
+	" of folds works correctly.
+	" Put numcol in a separate group for sake of unselectable text.
+	let s:new = s:new . (s:settings.number_lines ? s:HtmlFormat_n(s:numcol, s:FOLDED_ID, 0) : "") . substitute(s:HtmlFormat_t(foldtextresult(s:lnum), s:FOLDED_ID, 0), '</span>', s:HtmlEndline.'\n\0', '')
 	let s:new = s:new . "<span class='fulltext'>"
 
 	" open the fold now that we have the fold text to allow retrieval of
@@ -902,14 +1375,13 @@ while s:lnum <= s:end
 	  " add the empty foldcolumn for unfolded lines if there is a fold
 	  " column at all
 	  if s:foldcolumn > 0
-	    let s:new = s:new . s:HtmlFormat(repeat(' ', s:foldcolumn), "FoldColumn", "")
+	    let s:new = s:new . s:FoldColumn_fill()
 	  endif
 	else
 	  " add the fold column for folds not on the opening line
 	  if get(s:foldstack, 0).firstline < s:lnum
-	    let s:new = s:new . "<a class='FoldColumn' href='javascript:toggleFold(\"fold".s:foldstack[0].id."\")'>"
-	    let s:new = s:new . repeat('|', s:foldstack[0].level)
-	    let s:new = s:new . repeat(' ', s:foldcolumn - s:foldstack[0].level) . "</a>"
+	    let s:new = s:new . s:FoldColumn_build('|', s:foldstack[0].level, s:foldcolumn - s:foldstack[0].level, "",
+		  \ 'FoldColumn', 'javascript:toggleFold("fold'.s:foldstack[0].id.'");')
 	  endif
 	endif
       endif
@@ -917,8 +1389,7 @@ while s:lnum <= s:end
 
     " Now continue with the unfolded line text
     if s:settings.number_lines
-      " TODO: why not use the real highlight name here?
-      let s:new = s:new . s:HtmlFormat(s:numcol, "lnr", "")
+      let s:new = s:new . s:HtmlFormat_n(s:numcol, s:LINENR_ID, 0)
     endif
 
     " Get the diff attribute, if any.
@@ -932,7 +1403,6 @@ while s:lnum <= s:end
 
     " most of the time we won't use the diff_id, initialize to zero
     let s:diff_id = 0
-    let s:diff_id_name = ""
 
     while s:col <= s:len || (s:col == 1 && s:diffattr)
       let s:startcol = s:col " The start column for processing text
@@ -1000,20 +1470,16 @@ while s:lnum <= s:end
 
 	" get the highlight group name to use
 	let s:id = synIDtrans(s:id)
-	let s:id_name = synIDattr(s:id, "name", s:whatterm)
-	if s:diff_id
-	  let s:diff_id_name = synIDattr(s:diff_id, "name", s:whatterm)
-	endif
       else
 	" use Conceal highlighting for concealed text
-	let s:id_name = 'Conceal'
+	let s:id = s:CONCEAL_ID
 	let s:expandedtab = s:concealinfo[1]
       endif
 
-      " Output the text with the same synID, with class set to {s:id_name},
-      " unless it has been concealed completely.
+      " Output the text with the same synID, with class set to the highlight ID
+      " name, unless it has been concealed completely.
       if strlen(s:expandedtab) > 0
-	let s:new = s:new . s:HtmlFormat(s:expandedtab,  s:id_name, s:diff_id_name)
+	let s:new = s:new . s:HtmlFormat(s:expandedtab,  s:id, s:diff_id, 0)
       endif
     endwhile
   endif
@@ -1038,9 +1504,9 @@ if s:settings.dynamic_folds
   endwhile
 
   " add fold column to the style list if not already there
-  let s:id = hlID('FoldColumn')
-  if index(s:idlist, s:id) == -1
-    call insert(s:idlist, s:id)
+  let s:id = s:FOLD_C_ID
+  if !has_key(s:stylelist, s:id)
+    let s:stylelist[s:id] = '.FoldColumn { ' . s:CSS1(s:id) . '}'
   endif
 endif
 
@@ -1049,7 +1515,7 @@ if s:settings.no_pre
     " Close off the font tag that encapsulates the whole <body>
     call extend(s:lines, ["</font>", "</body>", "</html>"])
   else
-    call extend(s:lines, ["</body>", "</html>"])
+    call extend(s:lines, ["</div>", "</body>", "</html>"])
   endif
 else
   call extend(s:lines, ["</pre>", "</body>", "</html>"])
@@ -1059,29 +1525,27 @@ exe s:newwin . "wincmd w"
 call setline(1, s:lines)
 unlet s:lines
 
+" Mangle modelines so Vim doesn't try to use HTML text as a modeline if editing
+" this file in the future; need to do this after generating all the text in case
+" the modeline text has different highlight groups which all turn out to be
+" stripped from the final output.
+%s!\v(%(^|\s+)%(vim?|ex)):!\1\&#0058;!ge
+
 " Now, when we finally know which, we define the colors and styles
 if s:settings.use_css
   1;/<style type="text/+1
 endif
 
-" Find out the background and foreground color.
-let s:fgc = s:HtmlColor(synIDattr(hlID("Normal"), "fg#", s:whatterm))
-let s:bgc = s:HtmlColor(synIDattr(hlID("Normal"), "bg#", s:whatterm))
-if s:fgc == ""
-  let s:fgc = ( &background == "dark" ? "#ffffff" : "#000000" )
-endif
-if s:bgc == ""
-  let s:bgc = ( &background == "dark" ? "#000000" : "#ffffff" )
-endif
-
 " Normal/global attributes
 " For Netscape 4, set <body> attributes too, though, strictly speaking, it's
 " incorrect.
 if s:settings.use_css
   if s:settings.no_pre
-    execute "normal! A\nbody { color: " . s:fgc . "; background-color: " . s:bgc . "; font-family: ". s:htmlfont ."; }\e"
+    call append('.', "body { color: " . s:fgc . "; background-color: " . s:bgc . "; font-family: ". s:htmlfont ."; }")
+    +
   else
-    execute "normal! A\npre { " . s:whitespace . "font-family: ". s:htmlfont ."; color: " . s:fgc . "; background-color: " . s:bgc . "; }\e"
+    call append('.', "pre { " . s:whitespace . "font-family: ". s:htmlfont ."; color: " . s:fgc . "; background-color: " . s:bgc . "; }")
+    +
     yank
     put
     execute "normal! ^cwbody\e"
@@ -1090,64 +1554,85 @@ if s:settings.use_css
       exec 's#'.s:whitespace
     endif
   endif
+  " fix browser inconsistencies (sometimes within the same browser) of different
+  " default font size for different elements
+  call append('.', '* { font-size: 1em; }')
+  +
+  " if we use any input elements for unselectable content, make sure they look
+  " like normal text
+  if !empty(s:settings.prevent_copy)
+    call append('.', 'input { border: none; margin: 0; padding: 0; font-family: '.s:htmlfont.'; }')
+    +
+    " ch units for browsers which support them, em units for a somewhat
+    " reasonable fallback. Also make sure the special elements for size
+    " calculations aren't seen.
+    call append('.', [
+	  \ "input[size='1'] { width: 1em; width: 1ch; }",
+	  \ "input[size='2'] { width: 2em; width: 2ch; }",
+	  \ "input[size='3'] { width: 3em; width: 3ch; }",
+	  \ "input[size='4'] { width: 4em; width: 4ch; }",
+	  \ "input[size='5'] { width: 5em; width: 5ch; }",
+	  \ "input[size='6'] { width: 6em; width: 6ch; }",
+	  \ "input[size='7'] { width: 7em; width: 7ch; }",
+	  \ "input[size='8'] { width: 8em; width: 8ch; }",
+	  \ "input[size='9'] { width: 9em; width: 9ch; }",
+	  \ "input[size='10'] { width: 10em; width: 10ch; }",
+	  \ "input[size='11'] { width: 11em; width: 11ch; }",
+	  \ "input[size='12'] { width: 12em; width: 12ch; }",
+	  \ "input[size='13'] { width: 13em; width: 13ch; }",
+	  \ "input[size='14'] { width: 14em; width: 14ch; }",
+	  \ "input[size='15'] { width: 15em; width: 15ch; }",
+	  \ "input[size='16'] { width: 16em; width: 16ch; }",
+	  \ "input[size='17'] { width: 17em; width: 17ch; }",
+	  \ "input[size='18'] { width: 18em; width: 18ch; }",
+	  \ "input[size='19'] { width: 19em; width: 19ch; }",
+	  \ "input[size='20'] { width: 20em; width: 20ch; }",
+	  \ "#oneCharWidth, #oneEmWidth, #oneInputWidth { padding: 0; margin: 0; position: absolute; left: -999999px; visibility: hidden; }"
+	  \ ])
+    +21
+    for w in range(5, 100, 5)
+      let base = 0.01 * w
+      call append('.', join(map(range(1,20), "'.em'.w.' input[size='''.v:val.'''] { width: '.string(v:val*base).'em; }'")))
+      +
+    endfor
+    if s:settings.prevent_copy =~# 'f'
+    " Make the cursor show active fold columns as active areas, and empty fold
+    " columns as not interactive.
+      call append('.', ['input.FoldColumn { cursor: pointer; }',
+	    \ 'input.FoldColumn[value=""] { cursor: default; }'
+	    \ ])
+      +2
+    endif
+    " make line number column show as non-interactive if not selectable
+    if s:settings.prevent_copy =~# 'n'
+      call append('.', 'input.LineNr { cursor: default; }')
+      +
+    endif
+    " make fold text and line number column within fold text show as
+    " non-interactive if not selectable
+    if (s:settings.prevent_copy =~# 'n' || s:settings.prevent_copy =~# 't') && !s:settings.ignore_folding
+      call append('.', 'input.Folded { cursor: default; }')
+      +
+    endif
+  endif
 else
   execute '%s:<body>:<body bgcolor="' . s:bgc . '" text="' . s:fgc . '">\r<font face="'. s:htmlfont .'">'
 endif
 
-" Line numbering attributes
-if s:settings.number_lines
-  if s:settings.use_css
-    execute "normal! A\n.lnr { " . s:CSS1(hlID("LineNr")) . "}\e"
-  else
-    execute '%s+^<span class="lnr">\([^<]*\)</span>+' . s:HtmlOpening(hlID("LineNr")) . '\1' . s:HtmlClosing(hlID("LineNr")) . '+g'
+" Gather attributes for all other classes. Do diff first so that normal
+" highlight groups are inserted before it.
+if s:settings.use_css
+  if s:diff_mode
+    call append('.', filter(map(keys(s:diffstylelist), "s:diffstylelist[v:val]"), 'v:val != ""'))
+  endif
+  if !empty(s:stylelist)
+    call append('.', filter(map(keys(s:stylelist), "s:stylelist[v:val]"), 'v:val != ""'))
   endif
 endif
 
-" Gather attributes for all other classes
-if !s:settings.no_progress && !empty(s:idlist)
-  let s:pgb = s:ProgressBar("Processing classes:", len(s:idlist),s:newwin)
-endif
-while !empty(s:idlist)
-  let s:attr = ""
-  let s:id = remove(s:idlist, 0)
-  let s:attr = s:CSS1(s:id)
-  let s:id_name = synIDattr(s:id, "name", s:whatterm)
-
-  " If the class has some attributes, export the style, otherwise DELETE all
-  " its occurences to make the HTML shorter
-  if s:attr != ""
-    if s:settings.use_css
-      execute "normal! A\n." . s:id_name . " { " . s:attr . "}"
-    else
-      " replace spans of just this class name with non-CSS style markup
-      execute '%s+<span class="' . s:id_name . '">\([^<]*\)</span>+' . s:HtmlOpening(s:id) . '\1' . s:HtmlClosing(s:id) . '+ge'
-      " Replace spans of this class name AND a diff class with non-CSS style
-      " markup surrounding a span of just the diff class. The diff class will
-      " be handled later because we know that information is at the end.
-      execute '%s+<span class="' . s:id_name . ' \(Diff\%(Add\|Change\|Delete\|Text\)\)">\([^<]*\)</span>+' . s:HtmlOpening(s:id) . '<span class="\1">\2</span>' . s:HtmlClosing(s:id) . '+ge'
-    endif
-  else
-    execute '%s+<span class="' . s:id_name . '">\([^<]*\)</span>+\1+ge'
-    execute '%s+<span class="' . s:id_name . ' \(Diff\%(Add\|Change\|Delete\|Text\)\)">\([^<]*\)</span>+<span class="\1">\2</span>+ge'
-    if s:settings.use_css
-      1;/<\/style>/-2
-    endif
-  endif
-
-  if !s:settings.no_progress
-    call s:pgb.incr()
-    if s:pgb.needs_redraw
-      redrawstatus
-      let s:pgb.needs_redraw = 0
-      " TODO: sleep here to show the progress bar, but only if total time spent
-      " so far on this step is < 1 second? Too slow for batch runs like the test
-      " suite to sleep all the time. Maybe there's no good reason to sleep at
-      " all.
-    endif
-  endif
-endwhile
-
 " Add hyperlinks
+" TODO: add option to not do this? Maybe just make the color the same as the
+" text highlight group normally is?
 %s+\(https\=://\S\{-}\)\(\([.,;:}]\=\(\s\|$\)\)\|[\\"'<>]\|&gt;\|&lt;\|&quot;\)+<a href="\1">\1</a>\2+ge
 
 " The DTD
@@ -1201,14 +1686,15 @@ unlet s:htmlfont s:whitespace
 unlet s:old_et s:old_paste s:old_icon s:old_report s:old_title s:old_search
 unlet s:old_magic s:old_more s:old_fdm s:old_fen s:old_winheight
 unlet! s:old_isprint
-unlet s:whatterm s:idlist s:lnum s:end s:margin s:fgc s:bgc s:old_winfixheight
-unlet! s:col s:id s:attr s:len s:line s:new s:expandedtab s:concealinfo
+unlet s:whatterm s:stylelist s:diffstylelist s:lnum s:end s:margin s:fgc s:bgc s:old_winfixheight
+unlet! s:col s:id s:attr s:len s:line s:new s:expandedtab s:concealinfo s:diff_mode
 unlet! s:orgwin s:newwin s:orgbufnr s:idx s:i s:offset s:ls s:origwin_stl
 unlet! s:newwin_stl s:current_syntax
 if !v:profiling
   delfunc s:HtmlColor
   delfunc s:HtmlFormat
   delfunc s:CSS1
+  delfunc s:BuildStyleWrapper
   if !s:settings.use_css
     delfunc s:HtmlOpening
     delfunc s:HtmlClosing
@@ -1226,8 +1712,8 @@ if !v:profiling
 endif
 
 unlet! s:new_lnum s:diffattr s:difffillchar s:foldfillchar s:HtmlSpace
-unlet! s:LeadingSpace s:HtmlEndline s:firstfold s:foldcolumn
-unlet s:foldstack s:allfolds s:foldId s:numcol s:settings
+unlet! s:LeadingSpace s:HtmlEndline s:firstfold s:numcol s:foldcolumn
+unlet s:foldstack s:allfolds s:foldId s:settings
 
 let &cpo = s:cpo_sav
 unlet! s:cpo_sav
--- a/runtime/syntax/help.vim
+++ b/runtime/syntax/help.vim
@@ -1,7 +1,7 @@
 " Vim syntax file
 " Language:	Vim help file
 " Maintainer:	Bram Moolenaar (Bram@vim.org)
-" Last Change:	2012 May 18
+" Last Change:	2012 Jul 16
 
 " Quit when a (custom) syntax file was already loaded
 if exists("b:current_syntax")
@@ -12,8 +12,8 @@ let s:cpo_save = &cpo
 set cpo&vim
 
 syn match helpHeadline		"^[-A-Z .][-A-Z0-9 .()]*[ \t]\+\*"me=e-1
-syn match helpSectionDelim	"^=\{3,}.*===$"
-syn match helpSectionDelim	"^-\{3,}.*--$"
+syn match helpSectionDelim	"^===.*===$"
+syn match helpSectionDelim	"^---.*--$"
 syn region helpExample		matchgroup=helpIgnore start=" >$" start="^>$" end="^[^ \t]"me=e-1 end="^<"
 if has("ebcdic")
   syn match helpHyperTextJump	"\\\@<!|[^"*|]\+|" contains=helpBar
--- a/runtime/syntax/svn.vim
+++ b/runtime/syntax/svn.vim
@@ -2,14 +2,15 @@
 " Language:     Subversion (svn) commit file
 " Maintainer:   Dmitry Vasiliev <dima at hlabs dot org>
 " URL:          https://github.com/hdima/vim-scripts/blob/master/syntax/svn.vim
-" Last Change:  2012-04-15
+" Last Change:  2012-07-21
 " Filenames:    svn-commit*.tmp
-" Version:      1.8
+" Version:      1.9
 
 " Contributors:
 "   Stefano Zacchiroli
 "   A. S. Budden
 "   Myk Taylor
+"   Ingo Karkat
 
 " For version 5.x: Clear all syntax items.
 " For version 6.x: Quit when a syntax file was already loaded.
@@ -19,7 +20,9 @@ elseif exists("b:current_syntax")
   finish
 endif
 
-syn region svnRegion    start="^--.*--$" end="\%$" contains=ALL contains=@NoSpell
+syn region svnText      start="\%^" end="^--.*--$"me=s-1 contains=@Spell
+
+syn region svnRegion    start="^--.*--$" end="\%$" contains=ALL
 syn match svnRemoved    "^D    .*$" contained
 syn match svnRenamed    "^R[ M][ U][ +] .*$" contained
 syn match svnAdded      "^A[ M][ U][ +] .*$" contained
--- a/runtime/tools/efm_perl.pl
+++ b/runtime/tools/efm_perl.pl
@@ -3,7 +3,7 @@
 # vimparse.pl - Reformats the error messages of the Perl interpreter for use
 # with the quickfix mode of Vim
 #
-# Copyright (©) 2001 by Jörg Ziefle <joerg.ziefle@gmx.de>
+# Copyright (c) 2001 by Joerg Ziefle <joerg.ziefle@gmx.de>
 # You may use and distribute this software under the same terms as Perl itself.
 #
 # Usage: put one of the two configurations below in your ~/.vimrc (without the