changeset 10244:876fbdd84e52

commit https://github.com/vim/vim/commit/2ec618c9feac4573b154510236ad8121c77d0eca Author: Bram Moolenaar <Bram@vim.org> Date: Sat Oct 1 14:47:05 2016 +0200 Updated runtime files.
author Christian Brabandt <cb@256bit.org>
date Sat, 01 Oct 2016 15:00:04 +0200
parents fe057ff11e5f
children d76ccdacb41e
files runtime/autoload/gzip.vim runtime/doc/autocmd.txt runtime/doc/channel.txt runtime/doc/cmdline.txt runtime/doc/editing.txt runtime/doc/eval.txt runtime/doc/if_ruby.txt runtime/doc/index.txt runtime/doc/options.txt runtime/doc/syntax.txt runtime/doc/tags runtime/doc/todo.txt runtime/ftplugin/mf.vim runtime/ftplugin/mp.vim runtime/indent/fortran.vim runtime/indent/mf.vim runtime/indent/mp.vim runtime/syntax/debsources.vim runtime/syntax/mf.vim runtime/syntax/mp.vim
diffstat 20 files changed, 1519 insertions(+), 725 deletions(-) [+]
line wrap: on
line diff
--- a/runtime/autoload/gzip.vim
+++ b/runtime/autoload/gzip.vim
@@ -1,6 +1,6 @@
 " Vim autoload file for editing compressed files.
 " Maintainer: Bram Moolenaar <Bram@vim.org>
-" Last Change: 2014 Nov 05
+" Last Change: 2016 Sep 28
 
 " These functions are used by the gzip plugin.
 
@@ -63,6 +63,9 @@ fun gzip#read(cmd)
   " set 'modifiable'
   let ma_save = &ma
   setlocal ma
+  " set 'write'
+  let write_save = &write
+  set write
   " Reset 'foldenable', otherwise line numbers get adjusted.
   if has("folding")
     let fen_save = &fen
@@ -127,6 +130,7 @@ fun gzip#read(cmd)
   let &pm = pm_save
   let &cpo = cpo_save
   let &l:ma = ma_save
+  let &write = write_save
   if has("folding")
     let &l:fen = fen_save
   endif
--- a/runtime/doc/autocmd.txt
+++ b/runtime/doc/autocmd.txt
@@ -1,4 +1,4 @@
-*autocmd.txt*   For Vim version 8.0.  Last change: 2016 Sep 21
+*autocmd.txt*   For Vim version 8.0.  Last change: 2016 Sep 27
 
 
 		  VIM REFERENCE MANUAL    by Bram Moolenaar
@@ -79,11 +79,15 @@ exception is that "<sfile>" is expanded 
 
 Here Vim expands <sfile> to the name of the file containing this line.
 
-When your .vimrc file is sourced twice, the autocommands will appear twice.
-To avoid this, put this command in your .vimrc file, before defining
-autocommands: >
+`:autocmd` adds to the list of autocommands regardless of whether they are
+already present.  When your .vimrc file is sourced twice, the autocommands
+will appear twice.  To avoid this, define your autocommands in a group, so
+that you can easily clear them: >
 
-	:autocmd!	" Remove ALL autocommands for the current group.
+	augroup vimrc
+	  autocmd!	" Remove all vimrc autocommands
+	  au BufNewFile,BufRead *.html so <sfile>:h/html.vim
+	augroup END
 
 If you don't want to remove all autocommands, you can instead use a variable
 to ensure that Vim includes the autocommands only once: >
@@ -130,8 +134,13 @@ 3. Removing autocommands				*autocmd-rem
 
 :au[tocmd]! [group] {event}
 			Remove ALL autocommands for {event}.
+			Warning: You should not do this without a group for
+			|BufRead| and other common events, it can break
+			plugins, syntax highlighting, etc.
 
 :au[tocmd]! [group]	Remove ALL autocommands.
+			Warning: You should normally not do this without a
+			group, it breaks plugins, syntax highlighting, etc.
 
 When the [group] argument is not given, Vim uses the current group (as defined
 with ":augroup"); otherwise, Vim uses the group defined with [group].
--- a/runtime/doc/channel.txt
+++ b/runtime/doc/channel.txt
@@ -1,4 +1,4 @@
-*channel.txt*      For Vim version 8.0.  Last change: 2016 Sep 20
+*channel.txt*      For Vim version 8.0.  Last change: 2016 Sep 29
 
 
 		  VIM REFERENCE MANUAL	  by Bram Moolenaar
@@ -465,6 +465,11 @@ it like this: >
 Without the handler you need to read the output with |ch_read()| or
 |ch_readraw()|. You can do this in the close callback, see |read-in-close-cb|.
 
+Note that if the job exits before you read the output, the output may be lost.
+This depends on the system (on Unix this happens because closing the write end
+of a pipe causes the read end to get EOF).  To avoid this make the job sleep
+for a short while before it exits.
+
 The handler defined for "out_cb" will not receive stderr.  If you want to
 handle that separately, add an "err_cb" handler: >
     let job = job_start(command, {"out_cb": "MyHandler",
@@ -516,7 +521,7 @@ If the job can take some time and you do
 add a close callback and read the output there: >
 
 	func! CloseHandler(channel)
-	  while ch_status(a:channel) == 'buffered'
+	  while ch_status(a:channel, {'part': 'out'}) == 'buffered'
 	    echomsg ch_read(a:channel)
 	  endwhile
 	endfunc
--- a/runtime/doc/cmdline.txt
+++ b/runtime/doc/cmdline.txt
@@ -1,4 +1,4 @@
-*cmdline.txt*   For Vim version 8.0.  Last change: 2016 Aug 27
+*cmdline.txt*   For Vim version 8.0.  Last change: 2016 Sep 27
 
 
 		  VIM REFERENCE MANUAL    by Bram Moolenaar
@@ -229,9 +229,10 @@ CTRL-Y		When there is a modeless selecti
 		the clipboard. |modeless-selection|
 		If there is no selection CTRL-Y is inserted as a character.
 
-CTRL-J					*c_CTRL-J* *c_<NL>* *c_<CR>* *c_CR*
+CTRL-M or CTRL-J		*c_CTRL-M* *c_CTRL-J* *c_<NL>* *c_<CR>* *c_CR*
 <CR> or <NL>	start entered command
-							*c_<Esc>* *c_Esc*
+
+CTRL-[						*c_CTRL-[* *c_<Esc>* *c_Esc*
 <Esc>		When typed and 'x' not present in 'cpoptions', quit
 		Command-line mode without executing.  In macros or when 'x'
 		present in 'cpoptions', start entered command.
--- a/runtime/doc/editing.txt
+++ b/runtime/doc/editing.txt
@@ -1,4 +1,4 @@
-*editing.txt*   For Vim version 8.0.  Last change: 2016 Aug 06
+*editing.txt*   For Vim version 8.0.  Last change: 2016 Sep 27
 
 
 		  VIM REFERENCE MANUAL    by Bram Moolenaar
@@ -181,7 +181,8 @@ start editing another file, Vim will ref
 protection, add a '!' to the command.  The changes will then be lost.  For
 example: ":q" will not work if the buffer was changed, but ":q!" will.  To see
 whether the buffer was changed use the "CTRL-G" command.  The message includes
-the string "[Modified]" if the buffer has been changed.
+the string "[Modified]" if the buffer has been changed, or "+" if the 'm' flag
+is in 'shortmess'.
 
 If you want to automatically save the changes without asking, switch on the
 'autowriteall' option.  'autowrite' is the associated Vi-compatible option
--- a/runtime/doc/eval.txt
+++ b/runtime/doc/eval.txt
@@ -1,4 +1,4 @@
-*eval.txt*	For Vim version 8.0.  Last change: 2016 Sep 25
+*eval.txt*	For Vim version 8.0.  Last change: 2016 Sep 28
 
 
 		  VIM REFERENCE MANUAL	  by Bram Moolenaar
@@ -3072,7 +3072,7 @@ ch_log({msg} [, {handle}])					*ch_log()
 		When {handle} is passed the channel number is used for the
 		message.
 		{handle} can be Channel or a Job that has a Channel.  The
-		Channel must open.
+		Channel must be open for the channel number to be used.
 
 ch_logfile({fname} [, {mode}])					*ch_logfile()*
 		Start logging channel activity to {fname}.
@@ -3738,7 +3738,7 @@ filter({expr1}, {expr2})				*filter()*
 			call filter(myList, {idx, val -> idx * val <= 42})
 <		If you do not use "val" you can leave it out: >
 			call filter(myList, {idx -> idx % 2 == 1})
-
+<
 		The operation is done in-place.  If you want a |List| or
 		|Dictionary| to remain unmodified make a copy first: >
 			:let l = filter(copy(mylist), 'v:val =~ "KEEP"')
@@ -4369,7 +4369,7 @@ getfperm({fname})					*getfperm()*
 <		This will hopefully (from a security point of view) display
 		the string "rw-r--r--" or even "rw-------".
 
-		For setting permissins use |setfperm()|.
+		For setting permissions use |setfperm()|.
 
 getftime({fname})					*getftime()*
 		The result is a Number, which is the last modification time of
--- a/runtime/doc/if_ruby.txt
+++ b/runtime/doc/if_ruby.txt
@@ -207,21 +207,19 @@ MS-Windows ~
 
 You need to install the right version of Ruby for this to work.  You can find
 the package to download from:
-http://www.garbagecollect.jp/ruby/mswin32/en/download/release.html
-Currently that is ruby-1.9.2-p136-i386-mswin32.zip
+http://rubyinstaller.org/downloads/
+Currently that is rubyinstaller-2.2.5.exe
 
 To use the Ruby interface the Ruby DLL must be in your search path.  In a
 console window type "path" to see what directories are used.  The 'rubydll'
 option can be also used to specify the Ruby DLL.
 
 The name of the DLL must match the Ruby version Vim was compiled with.
-Currently the name is "msvcrt-ruby191.dll".  That is for Ruby 1.9.1.  To know
+Currently the name is "msvcrt-ruby220.dll".  That is for Ruby 2.2.X.  To know
 for sure edit "gvim.exe" and search for "ruby\d*.dll\c".
 
-If you want to build Vim with Ruby 1.9.1, you need to edit the config.h file
-and comment-out the check for _MSC_VER.
-You may also need to rename the include directory name to match the version,
-strangely for Ruby 1.9.3 the directory is called 1.9.1.
+If you want to build Vim with RubyInstaller 1.9 or 2.X using MSVC, you need
+some tricks.  See the src/INSTALLpc.txt for detail.
 
 
 Unix ~
--- a/runtime/doc/index.txt
+++ b/runtime/doc/index.txt
@@ -1,4 +1,4 @@
-*index.txt*     For Vim version 8.0.  Last change: 2016 Aug 27
+*index.txt*     For Vim version 8.0.  Last change: 2016 Sep 27
 
 
 		  VIM REFERENCE MANUAL    by Bram Moolenaar
@@ -1002,7 +1002,7 @@ tag		command	      action in Command-lin
 |c_CTRL-L|	CTRL-L		do completion on the pattern in front of the
 				cursor and insert the longest common part
 |c_<CR>|	<CR>		execute entered command
-|c_<CR>|	CTRL-M		same as <CR>
+|c_CTRL-M|	CTRL-M		same as <CR>
 |c_CTRL-N|	CTRL-N		after using 'wildchar' with multiple matches:
 				go to next match, otherwise: same as <Down>
 		CTRL-O		not used
@@ -1026,7 +1026,7 @@ tag		command	      action in Command-lin
 		CTRL-Y		copy (yank) modeless selection
 		CTRL-Z		not used (reserved for suspend)
 |c_<Esc>|	<Esc>		abandon command-line without executing it
-|c_<Esc>|	CTRL-[		same as <Esc>
+|c_CTRL-[|	CTRL-[		same as <Esc>
 |c_CTRL-\_CTRL-N| CTRL-\ CTRL-N	go to Normal mode, abandon command-line
 |c_CTRL-\_CTRL-G| CTRL-\ CTRL-G	go to mode specified with 'insertmode',
 				abandon command-line
--- a/runtime/doc/options.txt
+++ b/runtime/doc/options.txt
@@ -1,4 +1,4 @@
-*options.txt*	For Vim version 8.0.  Last change: 2016 Sep 16
+*options.txt*	For Vim version 8.0.  Last change: 2016 Oct 01
 
 
 		  VIM REFERENCE MANUAL	  by Bram Moolenaar
@@ -10,7 +10,7 @@ 1. Setting options			|set-option|
 2. Automatically setting options	|auto-setting|
 3. Options summary			|option-summary|
 
-For an overview of options see help.txt |option-list|.
+For an overview of options see quickref.txt |option-list|.
 
 Vim has a number of internal variables and switches which can be set to
 achieve special effects.  These options come in three forms:
@@ -1734,12 +1734,12 @@ A jump table for the options with a shor
 	option		+ set value	effect	~
 
 	'allowrevins'	  off		no CTRL-_ command
-	'backupcopy'	  Unix: "yes"	  backup file is a copy
-			  others: "auto"  copy or rename backup file
 	'backspace'	  ""		normal backspace
+	'backupcopy'	  Unix: "yes"	backup file is a copy
+			  else: "auto"  copy or rename backup file
 	'backup'	  off		no backup file
+	'cedit'		+ ""		no key to open the |cmdwin|
 	'cindent'	  off		no C code indentation
-	'cedit'		+ ""		no key to open the |cmdwin|
 	'cpoptions'	+ (all flags)	Vi-compatible flags
 	'cscopetag'	  off		don't use cscope for ":tag"
 	'cscopetagorder'  0		see |cscopetagorder|
@@ -1781,6 +1781,7 @@ A jump table for the options with a shor
 	'textwidth'	  0		no automatic line wrap
 	'tildeop'	  off		tilde is not an operator
 	'ttimeout'	  off		no terminal timeout
+	'viminfo'       + {unchanged}	no viminfo file	
 	'whichwrap'	+ ""		left-right movements don't wrap
 	'wildchar'	+ CTRL-E	only when the current value is <Tab>
 					use CTRL-E for cmdline completion
--- a/runtime/doc/syntax.txt
+++ b/runtime/doc/syntax.txt
@@ -1,4 +1,4 @@
-*syntax.txt*	For Vim version 8.0.  Last change: 2016 Sep 13
+*syntax.txt*	For Vim version 8.0.  Last change: 2016 Sep 29
 
 
 		  VIM REFERENCE MANUAL	  by Bram Moolenaar
@@ -3580,7 +3580,11 @@ DEFINING KEYWORDS					*:syn-keyword*
 
 DEFINING MATCHES					*:syn-match*
 
-:sy[ntax] match {group-name} [{options}] [excludenl] {pattern} [{options}]
+:sy[ntax] match {group-name} [{options}]
+		[excludenl]
+		[keepend]
+		{pattern}
+		[{options}]
 
 	This defines one match.
 
@@ -3589,6 +3593,9 @@ DEFINING MATCHES					*:syn-match*
 	[excludenl]		Don't make a pattern with the end-of-line "$"
 				extend a containing match or region.  Must be
 				given before the pattern. |:syn-excludenl|
+	keepend			Don't allow contained matches to go past a
+				match with the end pattern.  See
+				|:syn-keepend|.
 	{pattern}		The search pattern that defines the match.
 				See |:syn-pattern| below.
 				Note that the pattern may match more than one
--- a/runtime/doc/tags
+++ b/runtime/doc/tags
@@ -5184,6 +5184,7 @@ c_CTRL-I	cmdline.txt	/*c_CTRL-I*
 c_CTRL-J	cmdline.txt	/*c_CTRL-J*
 c_CTRL-K	cmdline.txt	/*c_CTRL-K*
 c_CTRL-L	cmdline.txt	/*c_CTRL-L*
+c_CTRL-M	cmdline.txt	/*c_CTRL-M*
 c_CTRL-N	cmdline.txt	/*c_CTRL-N*
 c_CTRL-P	cmdline.txt	/*c_CTRL-P*
 c_CTRL-Q	cmdline.txt	/*c_CTRL-Q*
@@ -5200,6 +5201,7 @@ c_CTRL-U	cmdline.txt	/*c_CTRL-U*
 c_CTRL-V	cmdline.txt	/*c_CTRL-V*
 c_CTRL-W	cmdline.txt	/*c_CTRL-W*
 c_CTRL-Y	cmdline.txt	/*c_CTRL-Y*
+c_CTRL-[	cmdline.txt	/*c_CTRL-[*
 c_CTRL-\_CTRL-G	intro.txt	/*c_CTRL-\\_CTRL-G*
 c_CTRL-\_CTRL-N	intro.txt	/*c_CTRL-\\_CTRL-N*
 c_CTRL-\_e	cmdline.txt	/*c_CTRL-\\_e*
--- a/runtime/doc/todo.txt
+++ b/runtime/doc/todo.txt
@@ -1,4 +1,4 @@
-*todo.txt*      For Vim version 8.0.  Last change: 2016 Sep 25
+*todo.txt*      For Vim version 8.0.  Last change: 2016 Oct 01
 
 
 		  VIM REFERENCE MANUAL	  by Bram Moolenaar
@@ -34,27 +34,11 @@ not be repeated below, unless there is e
 							*known-bugs*
 -------------------- Known bugs and current work -----------------------
 
-Move test71 tests to test_crypt.
-
-Idea from Sven: record sequence of keys.  Useful to show others what they are
-doing (look over the shoulder), and also to see what happened.
-Probably list of keystrokes, with some annotations for mode changes.
-Could store in logfile to be able to analyise it with an external command.
-E.g. to see when's the last time a plugin command was used.
-
-Patch for typos. (Matthew Brener, 2016 Sep 16, #1088)
-Lots of its to it's.
-
 After 8.0 is released:
 - Drop support for older MS-Windows systems, before XP.
   Patch from Ken Takata, updated 2016 Sep 12.
 
 +channel:
-- channel_wait() may return an error while there is still something to read.
-  Perhaps try to read once more?
-  Possibly reproduced by Santiago Alejandro Agüero, 2016 Sep 12, 13.
-  Apparently select() returns an error while reading could work.
-  Another example from Daniel Hahler, Sep 24.
 - Problem with stderr on Windows? (Vincent Rischmann, 2016 Aug 31, #1026)
 - Add 'cwd' argument to start_job(): directory to change to in the child.
     check for valid directory before forking.
@@ -118,11 +102,6 @@ Regexp problems:
   matches the empty string. (Dominique Pelle, 2015 Oct 2, Nov 24)
   had_endbrace[] is set but not initialized or used.
 
-Strang syntax highlighting problem. (Brett Stahlman, 2016 Sep 17)
-
-Patch to convert test_command_count into new style. (Naruhiko Nishino, 2016
-Sep 17)
-
 json_encode(): should convert to utf-8. (Nikolai Pavlov, 2016 Jan 23)
 What if there is an invalid character?
 
@@ -131,6 +110,8 @@ Or avoid recursiveness.
 
 Error in test_startup_utf8 on Solaris. (Danek Duvall, 2016 Aug 17)
 
+Patch to recognize tmux. (Michael Henry, 2016 Sep 29)
+
 Once .exe with updated installer is available: Add remark to download page
 about /S and /D options (Ken Takata, 2016 Apr 13)
 Or point to nightly builds: https://github.com/vim/vim-win32-installer/releases
@@ -147,6 +128,9 @@ Problem passing non-UTF-8 strings to Python 3. (Björn Linse, 2016 Sep 11,
 Use ADDR_OTHER instead of ADDR_LINES for many more commands.
 Add tests for using number larger than number of lines in buffer.
 
+Patch to make v:shell_error writable. (Christian Brabandt, 2016 Sep 27)
+Is there another solution?
+
 Invalid behavior with NULL list. (Nikolai Pavlov, #768)
 E.g. deepcopy(test_null_list())
 
@@ -163,6 +147,17 @@ Undo problem: "g-" doesn't go back, gets stuck. (Björn Linse, 2016 Jul 18)
 sort() is not stable when using numeric/float sort (Nikolay Pavlov, 2016 Sep
 4#1038)
 
+Patch to add "cmdline" completion to getcompletion(). (Shougo, Oct 1, #1140)
+
+Patch for systemlist(), add empty item. (thinca, Sep 30, #1135)
+Adjust the documentation instead?  Do include the test.
+
+Idea from Sven: record sequence of keys.  Useful to show others what they are
+doing (look over the shoulder), and also to see what happened.
+Probably list of keystrokes, with some annotations for mode changes.
+Could store in logfile to be able to analyise it with an external command.
+E.g. to see when's the last time a plugin command was used.
+
 cmap using execute() has side effects. (Killthemule, 2016 Aug 17, #983)
 
 Patch to change order of compiler flags. (Yousong Zhou, 2016 Sep 19, #1100)
@@ -200,6 +195,9 @@ Also for ":@.".
 
 Repeating 'opfunc' in a function only works once. (Tarmean, 2016 Jul 15, #925)
 
+Have a way to get the call stack, in a function and from an exception.
+#1125
+
 Second problem in #966: ins_compl_add_tv() uses get_dict_string() multiple
 times, overwrites the one buffer. (Nikolay Pavlov, 2016 Aug 5)
 
@@ -230,9 +228,6 @@ the last change in any buffer?  Can we u
 
 Ramel Eshed: system() is much slower than job_start(), why? (Aug 26)
 
-Patch for Python: #622. (Roland Puntaier, 2016 Feb 2)
-What does it change?
-
 Patch to make gd and gD work better for non-K&R code and with comments.
 (Anton Lindqvist, 2016 Aug 29)
 
@@ -250,11 +245,6 @@ 2013 Jul 30)  Update from Ken Takata, 20
 Update mentioned by Christian, 2016 Apr 25.
 Update from Ken Takata, 2016 Jul 17.
 
-Patch to improve cscope. (Adrian Kocis, #843)
-
-Patch for groovy multi-line comment highlighting. (Justin M. Keyes, 2016 May
-20 #644)
-
 When doing "vi buf.md" a BufNew autocommand for *.md is not triggered.
 Because of using the initial buffer? (Dun Peal, 2016 May 12)
 
@@ -329,9 +319,6 @@ Should use /usr/local/share/applications
 Or use $XDG_DATA_DIRS.
 Also need to run update-desktop-database (Kuriyama Kazunobu, 2015 Nov 4)
 
-Patch to test popupmenu.  Fails, possibly due to a bug.
-(Christian Brabandt, 2016 Jul 23)
-
 Patch to introduce 'cmdencoding'. (Ken Takata, Aug 18?)
 Better help Aug 19.
 Problem: applies to too many commands, such as :cbuffer.
@@ -344,9 +331,6 @@ Patch to have text objects defined by ar
 Thau, 2013 Nov 20, 2014 Jan 29, 2014 Jan 31)
 Added tests (James McCoy, 2016 Aug 3).  Still needs more work.
 
-Patch to add CTRL-N / CTRL-P while searching. (Christian Brabandt, 2016 Aug
-3)  Problem: two matches in one line and using CTRL-P does not move back.
-
 Access to uninitialized memory in match_backref() regexp_nda.c:4882
 (Dominique Pelle, 2015 Nov 6)
 
@@ -427,8 +411,6 @@ Add "===" to have a strict comparison (t
 Add "==*" (?) to have a value match, but no automatic conversion, and v:true
 equals 1 and 1.0, v:false equals 0 and 0.0.?
 
-Plugin to use Vim in MANPAGER.  Konfekt, PR #491
-
 Using uninitialized memory. (Dominique Pelle, 2015 Nov 4)
 
 MS-Windows: When editing a file with a leading space, writing it uses the
@@ -453,9 +435,6 @@ I can't recommend it though.
 Build with Python on Mac does not always use the right library.
 (Kazunobu Kuriyama, 2015 Mar 28)
 
-Need a Vim equivalent of Python's None and a way to test for it.
-Use v:none.  var == v:none
-
 Patch to add arguments to argc() and argv(). (Yegappan Lakshmanan, 2016 Jan
 24)  Also need a way to get the global arg list?  Update later on Jan 24
 Update Mar 5. Update Apr 7.  Update Jun 5.
@@ -498,10 +477,6 @@ the file name ends up encoded wrong. (Ra
 Patch for problem with restoring screen on Windows. (Nobuhiro Takasaki, 2015
 Sep 10)
 
-Patch to set antialiasing style on Windows. (Ondrej Balaz, 2013 Mar 14)
-Needs a different check for CLEARTYPE_QUALITY.
-Problem mentioned by Christian Brabandt, 2016 Jan 4.
-
 Example in editing.txt uses $HOME with the expectation that it ends in a
 slash.  For me it does, but perhaps not for everybody.  Add a function that
 inserts a slash when needed?  pathconcat(dir, path) (Thilo Six, 2015 Aug 12)
@@ -543,9 +518,6 @@ Breaks test_eval.  Inefficient, can we o
 Patch to use different terminal mode settings for system(). (Hayaki Saito)
 Does this work for everybody?
 
-Patch to add wordcount().  Same info as g CTRL-G. (Christian Brabandt, 2015
-Nov 17)
-
 Patch for man.vim. (SungHyun Nam, 2015 May 20)
 Doesn't work completely (Dominique Orban)
 
@@ -567,9 +539,6 @@ Mixup of highlighting when there is a ma
 
 Patch on Issue 72: 'autochdir' causes problems for :vimgrep.
 
-When 'balloonexpr' returns a list the result has a trailing newline.
-Just remove one trailing newline. (lcd, 2014 Oct 17)
-
 When two SIGWINCH arrive very quickly, the second one may be lost.
 (Josh Triplett, 2015 Sep 17)
 
@@ -673,7 +642,7 @@ right-mouse-drag on the status line to m
 its height?  It's like dragging the status bar above it at the same time.
 
 Can we make ":unlet $VAR" use unsetenv() to delete the env var?
-What for systems that don't have unsetenv()?
+What for systems that don't have unsetenv()?  (Issue #1116)
 
 Patch to add a :domodeline command. (Christian Brabandt, 2014 Oct 21)
 
@@ -728,9 +697,6 @@ Out of scope:
 Setting the spell file in a session only reads the local additions, not the
 normal spell file. (Enno Nagel, 2014 Mar 29)
 
-CTRL-] in Visual mode uses the selected text as a tag.  This does not work
-when preceded with CTRL-W. (Patrick Hemmer, 2014 Jun 28)
-
 When typing the first character of a command, e.g. "f", then using a menu, the
 menu item doesn't work.  Clear typeahead when using a menu?
 
@@ -772,9 +738,6 @@ Patch to right-align signs. (James Kolb 
 
 Patch to handle integer overflow. (Aaron Burrow, 2013 Dec 12)
 
-With "$" in 'cpoptions' the popup menu isn't fully drawn. (Matti Niemenmaa,
-2013 Sep 5)
-
 Patch to add "ntab" item in 'listchars' to repeat first character. (Nathaniel
 Braun, pragm, 2013 Oct 13)  A better solution 2014 Mar 5.
 
@@ -839,10 +802,6 @@ Patch to add {lhs} to :mapclear: clear a
 Exception caused by argument of return is not caught by try/catch.
 (David Barnett, 2013 Nov 19)
 
-8   'backupdir' and 'directory' should use $TMPDIR, $TMP and/or $TEMP when
-    defined.
-Issue 28.
-
 Patch to fix that 'cedit' is recognized after :normal. (Christian Brabandt,
 2013 Mar 19, later message)
 
@@ -887,8 +846,6 @@ How to test that it works well for all V
 
 Patch to make fold updates much faster. (Christian Brabandt, 2012 Dec)
 
-Issue 54: document behavior of -complete, also expands arg.
-
 -   Add regex for 'paragraphs' and 'sections': 'parare' and 'sectre'.  Combine
     the two into a regex for searching. (Ned Konz)
 Patch by Christian Brabandt, 2013 Apr 20, unfinished.
@@ -899,20 +856,11 @@ In the ATTENTION message about an existi
 process that is running.  It might actually be some other program, e.g. after
 a reboot.
 
-Patch to select the next or previous text object if there isn't one under the
-cursor. (Daniel Thau, 2013 Nov 20)
-
 patch to add "combine" flag to  syntax commands. (so8res, 2012 Dec 6)
 
-Bug caused by patch 7.3.1288?  Issue 183.
-I can't reproduce it.
-
 Syntax update problem in one buffer opened in two windows, bottom window is
 not correctly updated. (Paul Harris, 2012 Feb 27)
 
-Patch to add assignments in cscope. (Uli Meis, Estabrooks, 2012 Sep 1)
-Alternate patch by Gary Johnson, Sep 4.
-
 Patch to add getsid(). (Tyru, 2011 Oct 2)  Do we want this?  Update Oct 4.
 Or use expand('<sid>')?
 
@@ -950,10 +898,6 @@ Szamotulski, 2012 Nov 8)
 Session file creation: 'autochdir' causes trouble.  Keep it off until after
 loading all files.
 
-Win32: When 'autochdir' is on and 'encoding' is changed, files on the command
-line are opened again, but from the wrong directory.  Apply 'autochdir' only
-after starting up?
-
 8   "stl" and "stlnc" in 'fillchars' don't work for multi-byte characters.
     Patch by Christian Wellenbrock, 2013 Jul 5.
 
@@ -971,9 +915,6 @@ of many matches. (Cody Cutler, 2013 Mar 
 
 Patch to add tagfunc().  Cleaned up by Christian Brabandt, 2013 Jun 22.
 
-Help for 'b:undo_indent'. (Thilo Six, 2012 May 28)
-Also question if examples are correct.
-
 The input map for CTRL-O in mswin.vim causes problems after CTRL-X CTRL-O.
 Suggestion for another map. (Philip Mat, 2012 Jun 18)
 But use "gi" instead of "a".  Or use CTRL-\ CTRL-O.
@@ -1050,8 +991,6 @@ Only for MS-Windows.  No documentation. 
 
 Patch to support cursor shape in Cygwin console. (Ben bgold, 2011 Dec 27)
 
-Issue 64: when 'incsearch' is on can't paste LF on command line.
-
 On MS-Windows a temp dir with a & init causes system() to fail. (Ben Fritz,
 2012 Jun 19)
 
@@ -1103,10 +1042,6 @@ When using a Vim server, a # in the path
 Setting $HOME on MS-Windows is not very well documented.  Suggestion by Ben
 Fritz (2011 Oct 27).
 
-Bug: Windows 7 64 bit system freezes  when 'clipboard' set to "unnamed" and
-doing ":g/test/d".  Putting every delete on the clipboard? (Robert Chan, 2011
-Jun 17)
-
 When there is a ">" in a line that "gq" wraps to the start of the next line,
 then the following line will pick it up as a leader.  Should get the leader
 from the first line, not a wrapped line. (Matt Ackeret, 2012 Feb 27)
@@ -1186,12 +1121,6 @@ Is this needed?  CTRL-O and CTRL-I do th
 8   Add a command to jump to the next character highlighted with "Error".
 Patch by Christian Brabandt, uses ]e [e ]t and [t. 2011 Aug 9.
 
-8   Add an event like CursorHold that is triggered repeatedly, not just once
-    after typing something.
-Need for CursorHold that retriggers.  Use a key that doesn't do anything, or a
-function that resets did_cursorhold.
-Patch by Christian Brabandt, 2011 May 6.
-
 Add event for when the text scrolls.  A bit like CursorMoved.  Also a similar
 one for insert mode.  Use the event in matchparen to update the highlight if
 the match scrolls into view.
@@ -1328,9 +1257,6 @@ setwinvar().
 
 Patch for GVimExt to show an icon. (Dominik Riebeling, 2010 Nov 7)
 
-When writing a file > 2Gbyte, the reported number of bytes is negative.
-(Antonio Colombo, 2010 Dec 18)
-
 When 'lines' is 25 and 'scrolloff' is 12, "j" scrolls zero or two lines
 instead of one. (Constantin Pan, 2010 Sep 10)
 
@@ -1493,8 +1419,6 @@ Patch for GTK buttons X1Mouse and X2Mous
 
 Motif: Build on Ubuntu can't enter any text in dialog text fields.
 
-When 'ft' changes redraw custom status line.
-
 ":tab split fname" doesn't set the alternate file in the original window,
 because win_valid() always returns FALSE.  Below win_new_tabpage() in
 ex_docmd.c.
@@ -1542,10 +1466,6 @@ perhaps.  And undo CTRL-W.  CTRL-G l wou
 
 Diff mode out of sync. (Gary Johnson, 2010 Aug 4)
 
-Support a 'systemencoding' option (for Unix).  It specifies the encoding of
-file names. (Kikuchan, 2010 Oct 5).  Useful on a latin1 or double-byte Asian
-system when 'encoding' is "utf-8".
-
 Win32 GUI: last message from startup doesn't show up when there is an echoerr
 command. (Cyril Slobin, 2009 Mar 13)
 
@@ -1590,9 +1510,6 @@ Sergey Khorev)
 Consider making YankRing or something else that keeps a list of yanked text
 part of standard Vim.  The "1 to "9 registers are not sufficient.
 
-netrw: dragging status line causes selection of entry.  Should check row
-number to be below last visible line.
-
 After doing "su" $HOME can be the old user's home, thus ~root/file is not
 correct.  Don't use it in the swap file.
 
@@ -1663,8 +1580,6 @@ doesn't. (John Little, 2008 Nov 9)
 Shell expansion returns unexpanded string?
 Don't use shell when "~" is not at the start?
 
-":unlet $VAR" doesn't work.
-
 When using ":e ++enc=foo file" and the file is already loaded with
 'fileencoding' set to "bar", then do_ecmd() uses that buffer, even though the
 fileencoding differs.  Reload the buffer in this situation?  Need to check for
@@ -1699,9 +1614,6 @@ command is not executed.  Fix by Ian Kel
 ":help s/~" jumps to *s/\~*, while ":help s/\~" doesn't find anything. (Tim
 Chase)  Fix by Ian Kelling, 2008 Jul 14.
 
-Use "\U12345678" for 32 bit Unicode characters?  (Tony Mechelynck, 2009
-Apr 6)  Or use "\u(123456)", similar to Perl.
-
 When mapping : to ; and ; to :, @; doesn't work like @: and @: doesn't work
 either.  Matt Wozniski:  nv_at() calls do_execreg() which uses
 put_in_typebuf().  Char mapped twice?
@@ -1758,8 +1670,6 @@ 8   Use a mechanism similar to omni comp
     that the context can be taken into account. (Robert Webb)
 Patch by Christian Brabandt, 2013 May 31.
 
-Test54 should not use shell commands.  Make it portable.
-
 The utf class table is missing some entries:
 	0x2212, minus sign 
 	0x2217, star
@@ -1968,8 +1878,6 @@ patches by Mathias, see mail Feb 22)
 Win32: compiling with normal features and OLE fails.  Patch by Mathias
 Michaelis, 2006 Jun 4.
 
-Win16: include patches to make Win16 version work. (Vince Negri, 2006 May 22)
-
 Win32: after "[I" showing matches, scroll wheel messes up screen. (Tsakiridis,
 2007 Feb 18)
 Patch by Alex Dobrynin, 2007 Jun 3.  Also fixes other scroll wheel problems.
@@ -2007,9 +1915,6 @@ F1 - F4 in an xterm produce a different 
 modifier key.  Need to catch three different sequences.  Use K_ZF1, like
 K_ZHOME? (Dickey, 2007 Dec 2)
 
-UTF-8: mapping a multi-byte key where the second byte is 0x80 doesn't appear
-to work. (Tony Mechelynck, 2007 March 2)
-
 In debug mode, using CTRL-R = to evaluate a function causes stepping through
 the function. (Hari Krishna Dara, 2006 Jun 28)
 
@@ -2114,15 +2019,6 @@ When showing a diff between a non-existe
 cursor in the empty buffer, the other buffer only shows the last line.  Change
 the "insert" into a change from one line to many? (Yakov Lerner, 2008 May 27)
 
-Add autocommand for when a tabpage is being closed.  Also for when a tab page
-has been created.
-
-Using ":make" blocks Vim.  Allow running one make in the background (if the
-shell supports it), catch errors in a file and update the error list on the
-fly.  A bit like "!make > file&" and repeating ":cf file".  ":bgmake",
-background make.  ":bgcancel" interrupts it.
-A.Politz may work on this.
-
 These two abbreviations don't give the same result:
 	let asdfasdf = "xyz\<Left>"
 	cabbr XXX <C-R>=asdfasdf<CR>
@@ -2135,9 +2031,6 @@ In FileChangedShell command it's no long
 buffer.  But the changed buffer may differ from the current buffer, how to
 reload it then?
 
-New syntax files for fstab and resolv from Radu Dineiu, David Necas did
-previous version.
-
 For Aap: include a config.arg.example file with hints how to use config.arg.
 
 Command line completion when 'cmdheight' is maximum and 'wildmenu' is set,
@@ -2167,11 +2060,6 @@ start of the path is shown in the menu. 
 show more text of the completions.  Shorten the items that don't fit in the
 middle?
 
-When running inside screen it's possible to kill the X server and restart it
-(using pty's the program can keep on running).  Vim dies because it loses the
-connection to the X server.  Can Vim simply quit using the X server instead of
-dying?  Also relevant when running in a console.
-
 Accessing file#var in a function should not need the g: prepended.
 
 When exiting detects a modified buffer, instead of opening the buffer in the
@@ -2206,10 +2094,6 @@ the cursor line.  It works OK after some
 
 Win32: Is it possible to have both postscript and Win32 printing?
 
-Check: Running Vim in a console and still having connect to the X server for
-copy/paste: is stopping the X server handled gracefully?  Should catch the X
-error and stop using the connection to the server.
-
 Problem with 'cdpath' on MS-Windows when a directory is equal to $HOME. (2006
 Jul 26, Gary Johnson)
 
@@ -2246,30 +2130,11 @@ differently and unexpectedly.  Caused by
 The magic clipboard format "VimClipboard2" appears in several places.  Should
 be only one.
 
-"vim -C" often has 'nocompatible', because it's set somewhere in a startup
-script.  Do "set compatible" after startup?
-
-It's difficult to debug numbered functions (function in a Dictionary).  Print
-the function name before resolving it to a number?
-	let d = {}
-	fun! d.foo()
-	  echo "here"
-	endfun
-	call d.foo(9)
-
-Add a mark for the other end of the Visual area (VIsual pos).  '< and '> are
-only set after Visual moded is ended.
-Also add a variable for the Visual mode.  So that this mode and '< '> can be
-used to set what "gv" selects. (Ben Schmidt)
-
 Win32, NTFS: When editing a specific infostream directly and 'backupcopy' is
 "auto" should detect this situation and work like 'backupcopy' is "yes".  File
 name is something like "c:\path\foo.txt:bar", includes a colon.  (Alex
 Jakushev, 2008 Feb 1)
 
-printf() uses the field width in bytes. Can it be made character width,
-perhaps with a modifier?  What does Posix say?
-
 Small problem displaying diff filler line when opening windows with a script.
 (David Luyer, 2007 Mar 1 ~/Mail/oldmail/mool/in.15872 )
 
@@ -2290,8 +2155,6 @@ When completing from another file that u
 text has the wrong encoding.  E.g., when 'encoding' is utf-8 and file is
 latin1.  Example from Gombault Damien, 2007 Mar 24.
 
-Is it possible to use "foo#var" instead of "g:foo#var" inside a function?
-
 Syntax HL: When using "nextgroup" and the group has an empty match, there is
 no search at that position for another match. (Lukas Mai, 2008 April 11)
 
@@ -2352,8 +2215,6 @@ More patches:
 -   Another patch for Javascript indenting. (Hari Kumar, 2010 Jul 11)
     Needs a few tests.
 -   Add 'cscopeignorecase' option. (Liang Wenzhi, 2006 Sept 3)
--   Argument for feedkeys() to prepend to typeahead (Yakov Lerner, 2006 Oct
-    21)
 -   Load intl.dll too, not only libintl.dll. (Mike Williams, 2006 May 9, docs
     patch May 10)
 -   Extra argument to strtrans() to translate special keys to their name (Eric
@@ -2378,8 +2239,6 @@ More patches:
     Schmidt, 2008 Jul 22.
 -   testdir/Make_dos_sh.mak for running tests with MingW. (Bill Mccarthy, 2008
     Sep 13)
--   Patch for adding "space" item in 'listchars'. (Jérémie Roquet, 2009 Oct 29,
-    Docs patch Oct 30, update David Burgin (glts) 2013 Aug 24, 2014 Oct 10)
 -   Replace ccomplete.vim by cppcomplete.vim from www.vim.org?  script 1520 by
     Vissale Neang.  (Martin Stubenschrott) Asked Vissale to make the scripts
     more friendly for the Vim distribution.
@@ -2402,8 +2261,6 @@ 9   Mac unicode patch (Da Woon Jung, Eck
 9   HTML indenting can be slow.  Caused by using searchpair().  Can search()
     be used instead?  A.Politz is looking into a solution.
 8   Win32: Add minidump generation. (George Reilly, 2006 Apr 24)
-8   Add ":n" to fnamemodify(): normalize path, remove "../" when possible.
-    Aric Blumer has a patch for this.  He will update the patch for 6.3.
 7   Completion of network shares, patch by Yasuhiro Matsumoto.
     Update 2004 Sep 6.
     How does this work?  Missing comments.
@@ -2504,8 +2361,6 @@ 7   The ":map" command output overwrites
     the ":map" when it's used without arguments?
 7   CTRL-L is not the end of a section?  It is for Posix!  Make it an option.
 7   Implement 'prompt' option.	Init to off when stdin is not a tty.
-7   CTRL-T in Insert mode inserts 'shiftwidth' of spaces at the cursor.  Add a
-    flag in 'cpoptions' for this.
 7   Add a way to send an email for a crashed edit session.  Create a file when
     making changes (containing name of the swap file), delete it when writing
     the file.  Supply a program that can check for crashed sessions (either
@@ -2568,9 +2423,6 @@ 8   When 'encoding' is "utf-8", should u
 7   When font smoothing is enabled, redrawing can become very slow.  The reason
     appears to be drawing with a transparent background.  Would it be possible
     to use an opaque background in most places?
-8   Use another default for 'termencoding': the active codepage.  Means that
-    when 'encoding' is changed typing characters still works properly.
-    Alternative: use the Unicode functions to obtain typed characters.
 7   The cursor color indicating IME mode doesn't work properly. (Shizhu Pan,
     2004 May 9)
 8   Win32: When clicking on the gvim title bar, which gives it focus, produces
@@ -2783,14 +2635,6 @@ 8   When a buffer is editing a file like
     backslashes. (Ronald Hoellwarth)
 
 
-Windows 95:
-8   Editing a file by its short file name and writing it, makes the long file
-    name disappear.  Setting 'backupcopy' helps.
-    Use FindFirstFile()->cAlternateFileName in fname_case() (George Reilly).
-8   Doing wildcard expansion, will match the short filename, but result in the
-    long filename (both DJGPP and Win32).
-
-
 Win32 console:
 9   When editing a file by its short file name, it should be expanded into its
     long file name, to avoid problems like these: (Mccollister)
@@ -2814,9 +2658,6 @@ 9   tmpnam() uses file in root of file s
     a Netware network drive.  Use same function as for Win32 GUI?
 8   In os_win32.h, HAVE_STRICMP and HAVE_STRNICMP are defined only if __GNUC__
     is not defined.  Shouldn't that be the other way around?
-7   Use SetConsoleCP() and SetConsoleOutputCP() to implement 'termencoding'?
-    Avoids that input and output work differently.  Need to be restored when
-    exiting.
 
 
 Amiga:
@@ -2919,9 +2760,6 @@ 8   "gf" always excludes trailing punctu
     is currently fixed to use ".,:;!".  Add an option to make this
     configurable?
 8   'hkmap' should probably be global-local.
-9   When "$" is in 'cpoptions' and folding is active, a "C" command changes
-    the folds and resets w_lines_valid.  The display updating doesn't work
-    then. (Pritesh Mistry)
 8   Using ":s" in a function changes the previous replacement string.  Save
     "old_sub" in save_search_patterns()?
 8   Should allow multi-byte characters for the delimiter: ":s+a+b+" where "+"
@@ -2965,11 +2803,6 @@ 8   ":hardcopy":
     - Be able to print a window in diff mode.
     - Be able to specify a colorscheme to use for printing.  And a separate
       one for B&W printing (if that can be detected).
-8   In Visual block mode with 'lbr' set, a change command doesn't insert the
-    text in following lines where the linebreak changes.
-9   dosinst.c: The DJGPP version can't uninstall the Uninstall registry key on
-    Windows NT.  How to install a .inf file on Windows NT and how to detect
-    that Windows NT is being used?
 8   When 'virtualedit' is "block,insert" and encoding is "utf-8", selecting a
     block of one double-wide character, then "d" deletes only half of it.
 8   When 'virtualedit' is set, should "I" in blockwise visual mode also insert
@@ -3026,8 +2859,6 @@ 8   '[ and '] should be set to start/end
     (e.g., ":w").
 8   CTRL-A can't handle big "long" numbers, they become negative.  Check for
     "-" character, if not present, use unsigned long.
-8   Make it possible to disable the special meaning of "#" in the first column
-    for ">>".
 8   Add suspending with CTRL-Z at the "more" prompt, and when executing a long
     script in do_cmdline().
 8   When using 'hidden', many swap files will be open.  When Vim runs into the
@@ -3149,11 +2980,6 @@ Problems that will (probably) not be sol
 -   Amiga: The ":cq" command does not always abort the Manx compiler.  Why?
 -   Linux: A file with protection r--rw-rw- is seen readonly for others.  The
     access() function in GNU libc is probably wrong.
--   MSDOS: When using smartdrive with write-back buffering, writing to a
-    readonly floppy will cause problems.  How to test for a writable floppy
-    first?
--   MSDOS: Both 16 and 32 bit versions: File name expansion doesn't work for
-    names that start with a dot.  These used to be illegal file names.
 -   When doing a CTRL-Z and typing a command for the shell, while Vim is busy
     (e.g. writing a file), the command for the shell is sometimes eaten by Vim,
     because the terminal mode is changed from RAW to CBREAK.
@@ -3264,7 +3090,6 @@ 8   The GUI help should explain the Find
 8   List of options should mention whether environment variables are expanded
     or not.
 8   Extend usr_27.txt a bit. (Adam Seyfarth)
-7   Add a section on debugging scripts in the user manual.
 9   Make the Reference Manual more precise.  For each command mention:
     - change to cursor position and curswant
     - if it can be undone (u/CTRL-R) and redone (.)
@@ -3290,7 +3115,6 @@ Help:
 -   When a help item has multiple matches make it possible to use ":tn" to go
     to the other matches.
 -   Support a way to view (and edit) .info files.
--   Default mapping for help files: <Tab> to position cursor on next |:tag|.
 -   Implement a "sticky" help window, some help text lines that are always
     displayed in a window with fixed height. (Guckes)  Use "~/.vimhelp" file,
     user can edit it to insert his favorite commands, new account can contain a
@@ -3314,20 +3138,12 @@ 8   Remember the name of the vimrc file 
     $HOME/_vimrc, etc.) and add "edit vimrc" to the File menu.
 -   Add a way to save local settings and mappings into a new plugin file.
     ":mkplugin <file>"?
-8   Add ":plugininstall" command.  Can be used to install a plugin file that
-    includes documentation.  Let the user select a directory from
-    'runtimepath'.
-	" Vim plugin
-	<main plugin code>
-	" >>> plugin help start <<<
-	<plugin docs>
 -   Add mappings local to a window: ":map <window> ..."?
 9   Add buffer-local menu.  Should offer a choice between removing the menu or
     disabling it.  Be careful that tear-offs don't disappear (keep one empty
     item?).
     Alternative: use BufEnter and BufLeave autocommands.
 8   make a vimtutor script for Amiga and other systems.
-7   Add the arguments for configure to the ":version" output?
 7   When Vim detects a file is being edited elsewhere and it's a gvim session
     of the same user it should offer a "Raise" button, so that the other gvim
     window can be displayed. (Eduard)
@@ -3346,7 +3162,6 @@ 8   balloons for the tab page labels tha
 7   :tabdup	 duplicate the tab with all its windows.
 7   Option to put tab line at the left or right?  Need an option to specify
     its width.  It's like a separate window with ":tabs" output.
-7   Add local variables for each tab page?
 8   Add local options for each tab page?  E.g., 'diffopt' could differ between
     tab pages.
 7   Add local highlighting for each tab page?
@@ -3450,15 +3265,8 @@ 9   When making small changes, e.g. dele
 9   Instead invoking an external diff program, use builtin code.  One can be
     found here: http://www.ioplex.com/~miallen/libmba/dl/src/diff.c
     It's quite big and badly documented though.
-8   Use diff mode to show the changes made in a buffer (compared to the file).
-    Use an unnamed buffer, like doing:
-	new | set bt=nofile | r # | 0d_ | diffthis | wincmd p | diffthis
-    Also show difference with the file when editing started?  Should show what
+8   Also show difference with the file when editing started?  Should show what
     can be undone. (Tom Popovich)
-7   Add cursor-binding: when moving the cursor in one diff'ed buffer, also
-    move it in other diff'ed buffers, so that CTRL-W commands go to the same
-    location.
-
 
 Folding:
     (commands still available: zI zJ zK zp zP zq zQ zV zy zY;
@@ -3466,8 +3274,6 @@ Folding:
 8   Vertical folds: looks like vertically split windows, but the cursor moves
     through the vertical separator, separator moves when scrolling.
 8   Add "z/" and "z?" for searching in not folded text only.
-9   Add search pattern item to only match in closed or open fold and/or fold
-    with certain level.  Allows doing ":g/pat/cmd" to work on closed folds.
 8   When a closed fold is displayed open because of 'foldminlines', the
     behavior of commands is still like the fold is closed.  How to make the
     user aware of this?
@@ -3498,9 +3304,6 @@ 7   When using manual folding, the undo 
 -   'foldmethod' "syntax": "fold=3" argument: set fold level for a region or
     match.
 -   Apply a new foldlevel to a range of lines. (Steve Litt)
-8   Have some way to restrict commands to not folded text.  Also commands like
-    searches.
-
 
 Multi-byte characters:
 -   When editing a file with both utf-8 and latin1 text Vim always falls back
@@ -3692,9 +3495,6 @@ 8   Should support "me" offset for a reg
 8   When using a regexp for "contains=", should delay matching with it until
     redrawing happens.  Set a flag when a group is added, check this flag when
     highlighting starts.
-8   Some terminals can display colors like the GUI.  Add some setting to use
-    GUI colors for the terminal?  With something to define the escape
-    sequence.
 7   It's possible for an item to be transparent, so that the colors of an item
     lower on the stack is used.  Also do this with highlighting, so that the
     user can set transparent highlighting?  E.g. a number in a C comment would
@@ -3900,9 +3700,6 @@ 8   move_lines() copies every line into 
     so that we don't need to make a copy?  Or avoid invoking ml_updatechunk(),
     that is taking a lot of time.  (Ralf Wildenhues, 2008 Jul 7)
     With a patch, but does it work?
-8   Instead of loading rgb.txt every time a color wasn't recognized load it
-    once and keep it in memory.  Move the code to a common place to avoid
-    repeating it in various system files.
 8   Turn b_syn_ic and b_syn_containedin into b_syn_flags.
 9   Loading menu.vim still takes quite a bit of time.  How to make it faster?
 8   in_id_list() takes much time for syntax highlighting.  Cache the result?
@@ -3927,7 +3724,6 @@ 7   HTML syntax highlighting is slow for
     http://www.theregister.co.uk/content/4/22908.html. (Andre Pang)
 7   Check how performance of loading the wordlist can be improved (adding a
     lot of abbreviations).
-7   MS-DOS console: Add t_DL support, to make scrolling faster.
 7   Compile Ex commands to byte codes.  Store byte codes in a vim script file
     at the end, after "compiled:.  Make it look like a single comment line
     for old Vim versions.  Insert first line "Vim script compiled <timestamp>.
@@ -4052,8 +3848,6 @@ 7   Add a string to the 'display' option
 8   Add a ":refresh [winnr]" command, to force updating a window.  Useful from
     an event handler where ":normal" can't be used.  Also useful when
     'lazyredraw' is set in a mapping.
-7   Make 'list' and 'linebreak' work together.
-
 
 Scrolling:
 8   Add "zy" command: scroll horizontally to put the cursor in the middle.
@@ -4237,8 +4031,6 @@ 7   X11: Is it possible to free allocate
     use them again?  Otherwise, allow disabling allocating the default colors.
     Or allocate an own colormap (check UAE).  With an option to use it.  For
     the commandline, "-install" is mostly used for X11 programs.
-7   Add command line argument for "gvim" not to start the GUI.  Sort of the
-    inverse of "vim -g". (Vikas)
 7   Should support multi-column menus.
 -   Should add option for where to put the "Help" menu: like Motif at the far
     right, or with the other menus (but still at the right).
@@ -4539,7 +4331,6 @@ 8   When using CTRL-G CTRL-O do like CTR
 7   Use CTRL-G <count> to repeat what follows.  Useful for inserting a
     character multiple times or repeating CTRL-Y.
 -   Make 'revins' work in Replace mode.
-9   Can't use multi-byte characters for 'matchpairs'.
 7   Use 'matchpairs' for 'showmatch': When inserting a character check if it
     appears in the rhs of 'matchpairs'.
 -   In Insert mode (and command line editing?): Allow undo of the last typed
@@ -4681,8 +4472,6 @@ 8   Add a text object for any kind of qu
     use "aq" and "iq".  Use 'quotepairs' to define pairs of quotes, like
     'matchpairs'?
 8   Add text object for any kind of parens, also multi-byte ones.
-7   Add text object for current search pattern: "a/" and "i/".  Makes it
-    possible to turn text highlighted for 'hlsearch' into a Visual area.
 8   Add a way to make an ":omap" for a user-defined text object.  Requires
     changing the starting position in oap->start.
 8   Add "gp" and "gP" commands: insert text and make sure there is a single
@@ -4739,8 +4528,6 @@ 7   Support dragging the Visual area to 
     receive dropped text from another program. (Ben Godfrey)
 7   With blockwise Visual mode and "c", "C", "I", "A", etc., allow the use of
     a <CR>.  The entered lines are repeated over the Visual area.
-7   CTRL-V :s should substitute only in the block, not to whole lines. (David
-    Young is working on this)
 7   Filtering a block should only apply to the block, not to the whole lines.
     When the number of lines is increased, add lines. When decreased, pad with
     spaces or delete? Use ":`<,`>" on the command line.
@@ -4770,8 +4557,6 @@ 6   Add commands to move selected text, 
 
 More advanced repeating commands:
 -   Add "." command for visual mode: redo last visual command (e.g. ":fmt").
-7   Repeating "d:{cmd}" with "." doesn't work. (Benji Fisher)  Somehow remember
-    the command line so that it can be repeated?
 -   Add command to repeat last movement.  Including count.
 -   Add "." command after operator: repeat last command of same operator.  E.g.
     "c." will repeat last change, also when "x" used since then (Webb).
@@ -4800,9 +4585,6 @@ 8   Add a flag to ":abbrev" to eat the c
     not the <Space>.
 8   Give a warning when using CTRL-C in the lhs of a mapping.  It will never
     (?) work.
-8   Add a way to save a current mapping and restore it later.  Use a function
-    that returns the mapping command to restore it: mapcmd()?  mapcheck() is
-    not fool proof.  How to handle ambiguous mappings?
 7   Add <0x8f> (hex), <033> (octal) and <123> (decimal) to <> notation?
 7   When someone tries to unmap with a trailing space, and it fails, try
     unmapping without the trailing space.  Helps for ":unmap xx | unmap yy".
@@ -4855,8 +4637,6 @@ Incsearch:
     cases, saves a lot of time in big files. (Slootman wants to work on this?)
     When not using special characters, can continue search from the last match
     (or not at all, when there was no match).  See oldmail/webb/in.872.
--   With incsearch, use CTRL-N/CTRL-P to go to next/previous match, some other
-    key to copy matched word to search pattern (Alexander Schmid).
 
 
 Searching:
@@ -4880,9 +4660,6 @@ 8   Add a mechanism for recursiveness: "
 8   Show the progress every second.  Could use the code that checks for CTRL-C
     to find out how much time has passed.  Or use SIGALRM.  Where to show the
     number?
-8   When using an expression for ":s", set the match position in a v:
-    variable.  So that you can do ":%s/^/\=v:lnum/" to put a line number
-    before each line.
 7   Support for approximate-regexps to find similar words (agrep
     http://www.tgries.de/agrep/ tre: http://laurikari.net/tre/index.html).
 8   Add an item for a big character range, so that one can search for a
@@ -4891,8 +4668,6 @@ 7   Add an item stack to allow matching 
     the stack if previous atom matched".  Other side is "match with top of
     stack, pop it when it matches".  Use "\@pX" and "\@m"?
 	Example: \((\@p).\{-}\@m\)*
-7   Add an option to accept a match at the cursor position.  Also for
-    search(). (Brett)
 7   Add a flag to "/pat/" to discard an error.  Useful to continue a mapping
     when a search fails.  Could be "/pat/E" (e is already used for end offset).
 7   Add pattern item to use properties of Unicode characters.  In Perl it's
@@ -4996,9 +4771,6 @@ 9   ":gundo" command: global undo.  Undo
     when tests fail after making changes and you forgot in which files.
 9   After undo/redo, in the message show whether the buffer is modified or
     not.
-8   Use timestamps for undo, so that a version a certain time ago can be found
-    and info before some time/date can be flushed. 'undopersist' gives maximum
-    time to keep undo: "3h", "1d", "2w", "1y", etc.
 8   Search for pattern in undo tree, showing when it happened and the text
     state, so that you can jump to it.
 8   Undo tree: visually show the tree somehow (Damian Conway)
@@ -5006,13 +4778,6 @@ 8   Undo tree: visually show the tree so
     timestamp?
     Put branch with most recent change on the left, older changes get more
     indent?
-8   See ":e" as a change operation, find the changes and add them to the
-    undo info.  Also be able to undo the "Reload file" choice for when a file
-    was changed outside of Vim.
-    Would require doing a diff between the buffer text and the file and
-    storing the differences.
-    Alternative: before reloading a buffer, store it somewhere.  Keep a list
-    of about 10 last reloaded buffers.
 -   Make it possible to undo all the commands from a mapping, including a
     trailing unfinished command, e.g. for ":map K iX^[r".
 -   When accidentally hitting "R" instead of Ctrl-R, further Ctrl-R is not
@@ -5064,8 +4829,6 @@ 7   Add argument to ":ls" which is a pat
 7   Add expansion of buffer names, so that "*.c" is expanded to all buffer
     names.  Needed for ":bdel *.c", ":bunload *.c", etc.
 8   Support for <afile> where a buffer name is expected.
-8   Some commands don't use line numbers, but buffer numbers.  '$'
-    should then mean the number of the last buffer.  E.g.: "4,$bdel".
 7   Add an option to mostly use slashes in file names.  Separately for
     internal use and for when executing an external program?
 8   Some file systems are case-sensitive, some are not.  Besides
@@ -5385,11 +5148,6 @@ 7   Add a command that goes back to the 
 7   Allow a window not to have a statusline.  Makes it possible to use a
     window as a buffer-tab selection.
 8   Allow non-active windows to have a different statusline. (Yakov Lerner)
-7   Support using ":vert" with User commands.  Add expandable items <vert>.
-    Do the same for ":browse" and ":confirm"?
-    For ":silent" and ":debug" apply to the whole user command.
-    More general: need a way to access command modifiers in a user command.
-    Assign them to a v: variable?
 7   Add an invisible buffer which can be edited.  For use in scripts that want
     to manipulate text without changing the window layout.
 8   Add a command to revert to the saved version of file; undo or redo until
@@ -5439,10 +5197,6 @@ 8   Enabling features is a mix of config
     non-unix systems.  Perhaps let configure define CONF_XXX, and use #ifdef
     CONF_XXX in feature.h?  Then what should min-features and max-features do?
 8   Add "g^E" and "g^Y", to scroll a screen-full line up and down.
-6   Add ":timer" command, to set a command to be executed at a certain
-    interval, or once after some time has elapsed. (Aaron)
-    Perhaps an autocommand event like CursorHold is better?
-    Patch to add async functionality. (Geoff Greer, 2013 Sep 1 and later)
 8   Add ":confirm" handling in open_exfile(), for when file already exists.
 8   When quitting with changed files, make the dialog list the changed file
     and allow "write all", "discard all", "write some".  The last one would
@@ -5678,7 +5432,6 @@ 8   Allow opening an unnamed buffer with
     gives read errors.  Check protection before opening.
 -   When writing check for file exists but no permission, "Permission denied".
 -   If file does not exist, check if directory exists.
--   MSDOS: although t_cv and t_ci are not set, do invert char under cursor.
 -   Settings edit mode: make file with ":set opt=xx", edit it, parse it as ex
     commands.
 -   ":set -w all": list one option per line.
@@ -5713,10 +5466,7 @@ 8   Allow opening an unnamed buffer with
     instead of CTRL-R to make repeating possible. (Marinichev)
 -   Add "^Vb" on the command line, replace with word before or under the
     cursor?
--   Option to make a .swp file only when a change is made (Templeton).
 -   Support mapping for replace mode and "r" command (Vi doesn't do this)?
-5   Add 'ignorefilecase' option: Ignore case when expanding file names.
-    ":e ma<Tab>" would also find "Makefile" on Unix.
 8   Sorting of filenames for completion is wrong on systems that ignore
     case of filenames.  Add 'ignorefncase' option.  When set, case in
     filenames is ignored for sorting them. Patch by Mike Williams:
@@ -5785,11 +5535,6 @@ Far future and "big" extensions:
 -   Add open mode, use it when terminal has no cursor positioning.
 -   Special "drawing mode": a line is drawn where the cursor is moved to.
     Backspace deletes along the line (from jvim).
--   Implement ":Bset", set option in all buffers.  Also ":Wset", set in all
-    windows, ":Aset, set in all arguments and ":Tset", set in all files
-    mentioned in the tags file.
-    Add buffer/arg range, like in ":2,5B%s/..." (do we really need this???)
-    Add search string: "B/*.c/%s/.."?  Or ":F/*.c/%s/.."?
 -   Support for underlining (underscore-BS-char), bold (char-BS-char) and other
     standout modes switched on/off with , 'overstrike' option (Reiter).
 -   Add vertical mode (Paul Jury, Demirel): "5vdw" deletes a word in five
@@ -5805,8 +5550,5 @@ 4   Recognize l, #, p as 'flags' to EX c
     are reflected in each Vim immediately.  Could work with local files but
     also over the internet.  See http://www.codingmonkeys.de/subethaedit/.
 
-When using "do" or ":diffget" in a buffer with changes in every line an extra
-empty line would appear.
-
 vim:tw=78:sw=4:sts=4:ts=8:ft=help:norl:
 vim: set fo+=n :
--- a/runtime/ftplugin/mf.vim
+++ b/runtime/ftplugin/mf.vim
@@ -1,7 +1,8 @@
 " Vim filetype plugin file
-" Language:         MetaFont
-" Maintainer:       Nikolai Weibull <now@bitwi.se>
-" Latest Revision:  2008-07-09
+" Language:           METAFONT
+" Maintainer:         Nicola Vitacolonna <nvitacolonna@gmail.com>
+" Former Maintainers: Nikolai Weibull <now@bitwi.se>
+" Latest Revision:    2016 Oct 1
 
 if exists("b:did_ftplugin")
   finish
@@ -11,9 +12,62 @@ let b:did_ftplugin = 1
 let s:cpo_save = &cpo
 set cpo&vim
 
-let b:undo_ftplugin = "setl com< cms< fo<"
+let b:undo_ftplugin = "setl com< cms< fo< sua< inc< def< ofu<"
+      \ . "| unlet! b:match_ignorecase b:match_words b:match_skip"
+
+setlocal comments=:% commentstring=%\ %s formatoptions-=t formatoptions+=cjroql2
+setlocal suffixesadd=.mf
+let &l:include = '\<input\>'
+let &l:define = '\<\%(let\|newinternal\|interim\|def\|vardef\)\>\|\<\%(primary\|secondary\|tertiary\)def\>\s*[^ .]\+'
+setlocal omnifunc=syntaxcomplete#Complete
+let g:omni_syntax_group_include_mf = 'mf\w\+'
+let g:omni_syntax_group_exclude_mf = 'mfTodoComment'
+
+let s:mp_regex = {
+      \ 'beginsection' : '^\s*\%(\%(\|var\|primary\|secondary\|tertiary\)def\|beginchar\|beginlogochar\)\>',
+      \ 'endsection'   : '^\s*\%(enddef\|endchar\|endlogochar\)\>',
+      \ 'beginblock'   : '^\s*\%(begingroup\|if\|for\%(\|suffixes\|ever\)\)\>',
+      \ 'endblock'     : '^\s*\%(endgroup\|fi\|endfor\)\>'
+      \ }
+
+function! s:move_around(count, what, flags, visual)
+  if a:visual
+    exe "normal! gv"
+  endif
+  call search(s:mp_regex[a:what], a:flags.'s') " 's' sets previous context mark
+  for i in range(2, a:count)
+    call search(s:mp_regex[a:what], a:flags)
+  endfor
+endfunction
 
-setlocal comments=:% commentstring=%\ %s formatoptions-=t formatoptions+=croql
+
+" Move around macros.
+nnoremap <silent><buffer> [[ :<C-U>call <SID>move_around(v:count1, "beginsection", "bW", v:false) <CR>
+vnoremap <silent><buffer> [[ :<C-U>call <SID>move_around(v:count1, "beginsection", "bW", v:true)  <CR>
+nnoremap <silent><buffer> ]] :<C-U>call <SID>move_around(v:count1, "beginsection", "W",  v:false) <CR>
+vnoremap <silent><buffer> ]] :<C-U>call <SID>move_around(v:count1, "beginsection", "W",  v:true)  <CR>
+nnoremap <silent><buffer> [] :<C-U>call <SID>move_around(v:count1, "endsection",   "bW", v:false) <CR>
+vnoremap <silent><buffer> [] :<C-U>call <SID>move_around(v:count1, "endsection",   "bW", v:true)  <CR>
+nnoremap <silent><buffer> ][ :<C-U>call <SID>move_around(v:count1, "endsection",   "W",  v:false) <CR>
+vnoremap <silent><buffer> ][ :<C-U>call <SID>move_around(v:count1, "endsection",   "W",  v:true)  <CR>
+nnoremap <silent><buffer> [{ :<C-U>call <SID>move_around(v:count1, "beginblock",   "bW", v:false) <CR>
+vnoremap <silent><buffer> [{ :<C-U>call <SID>move_around(v:count1, "beginblock",   "bW", v:true)  <CR>
+nnoremap <silent><buffer> ]} :<C-U>call <SID>move_around(v:count1, "endblock",     "W",  v:false) <CR>
+vnoremap <silent><buffer> ]} :<C-U>call <SID>move_around(v:count1, "endblock",     "W",  v:true)  <CR>
+
+if exists("loaded_matchit")
+  let b:match_ignorecase = 0
+  let b:match_words =
+        \ '\<if\>:\<else\%[if]\>:\<fi\>,' .
+        \ '\<for\%(\|suffixes\|ever\)\>:\<exit\%(if\|unless\)\>:\<endfor\>,' .
+        \ '\<\%(\|var\|primary\|secondary\|tertiary\)def\>:\<enddef\>,' .
+        \ '\<begingroup\>:\<endgroup\>,' .
+        \ '\<beginchar\>:\<endchar\>' .
+        \ '\<beginlogochar\>:\<endlogochar\>'
+  " Ignore comments and strings
+  let b:match_skip = 'synIDattr(synID(line("."), col("."), 1), "name")
+        \ =~# "mf\\(Comment\\|String\\)$"'
+endif
 
 let &cpo = s:cpo_save
 unlet s:cpo_save
--- a/runtime/ftplugin/mp.vim
+++ b/runtime/ftplugin/mp.vim
@@ -1,7 +1,8 @@
 " Vim filetype plugin file
-" Language:         MetaPost
-" Maintainer:       Nikolai Weibull <now@bitwi.se>
-" Latest Revision:  2008-07-09
+" Language:           MetaPost
+" Maintainer:         Nicola Vitacolonna <nvitacolonna@gmail.com>
+" Former Maintainers: Nikolai Weibull <now@bitwi.se>
+" Latest Revision:    2016 Oct 1
 
 if exists("b:did_ftplugin")
   finish
@@ -11,9 +12,16 @@ let b:did_ftplugin = 1
 let s:cpo_save = &cpo
 set cpo&vim
 
-let b:undo_ftplugin = "setl com< cms< fo<"
+let b:undo_ftplugin = "setl com< cms< fo< sua< inc< def< ofu<"
+      \ . "| unlet! b:match_ignorecase b:match_words b:match_skip"
 
-setlocal comments=:% commentstring=%\ %s formatoptions-=t formatoptions+=croql
+setlocal comments=:% commentstring=%\ %s formatoptions-=t formatoptions+=cjroql2
+setlocal suffixesadd=.mp,.mpiv
+let &l:include = '\<\%(input\|loadmodule\)\>' " loadmodule is in MetaFun
+let &l:define = '\<\%(let\|newinternal\|interim\|def\|vardef\)\>\|\<\%(primary\|secondary\|tertiary\)def\>\s*[^ .]\+'
+setlocal omnifunc=syntaxcomplete#Complete
+let g:omni_syntax_group_include_mp = 'mf\w\+,mp\w\+'
+let g:omni_syntax_group_exclude_mp = 'mfTodoComment'
 
 if exists(":FixBeginfigs") != 2
   command -nargs=0 FixBeginfigs call s:fix_beginfigs()
@@ -24,5 +32,54 @@ if exists(":FixBeginfigs") != 2
   endfunction
 endif
 
+let s:mp_regex = {
+      \ 'beginsection' : '^\s*\%(\%(\|var\|primary\|secondary\|tertiary\)def\|begin\%(fig\|char\|logochar\|glyph\|graph\)\)\>',
+      \ 'endsection'   : '^\s*\%(enddef\|end\%(fig\|char\|logochar\|glyph\|graph\)\)\>',
+      \ 'beginblock'   : '^\s*\%(begingroup\|if\|for\%(\|suffixes\|ever\)\)\>',
+      \ 'endblock'     : '^\s*\%(endgroup\|fi\|endfor\)\>'
+      \ }
+
+function! s:move_around(count, what, flags, visual)
+  if a:visual
+    exe "normal! gv"
+  endif
+  call search(s:mp_regex[a:what], a:flags.'s') " 's' sets previous context mark
+  for i in range(2, a:count)
+    call search(s:mp_regex[a:what], a:flags)
+  endfor
+endfunction
+
+
+" Move around macros.
+nnoremap <silent><buffer> [[ :<C-U>call <SID>move_around(v:count1, "beginsection", "bW", v:false) <CR>
+vnoremap <silent><buffer> [[ :<C-U>call <SID>move_around(v:count1, "beginsection", "bW", v:true)  <CR>
+nnoremap <silent><buffer> ]] :<C-U>call <SID>move_around(v:count1, "beginsection", "W",  v:false) <CR>
+vnoremap <silent><buffer> ]] :<C-U>call <SID>move_around(v:count1, "beginsection", "W",  v:true)  <CR>
+nnoremap <silent><buffer> [] :<C-U>call <SID>move_around(v:count1, "endsection",   "bW", v:false) <CR>
+vnoremap <silent><buffer> [] :<C-U>call <SID>move_around(v:count1, "endsection",   "bW", v:true)  <CR>
+nnoremap <silent><buffer> ][ :<C-U>call <SID>move_around(v:count1, "endsection",   "W",  v:false) <CR>
+vnoremap <silent><buffer> ][ :<C-U>call <SID>move_around(v:count1, "endsection",   "W",  v:true)  <CR>
+nnoremap <silent><buffer> [{ :<C-U>call <SID>move_around(v:count1, "beginblock",   "bW", v:false) <CR>
+vnoremap <silent><buffer> [{ :<C-U>call <SID>move_around(v:count1, "beginblock",   "bW", v:true)  <CR>
+nnoremap <silent><buffer> ]} :<C-U>call <SID>move_around(v:count1, "endblock",     "W",  v:false) <CR>
+vnoremap <silent><buffer> ]} :<C-U>call <SID>move_around(v:count1, "endblock",     "W",  v:true)  <CR>
+
+if exists("loaded_matchit")
+  let b:match_ignorecase = 0
+  let b:match_words =
+        \ '\<if\>:\<else\%[if]\>:\<fi\>,' .
+        \ '\<for\%(\|suffixes\|ever\)\>:\<exit\%(if\|unless\)\>:\<endfor\>,' .
+        \ '\<\%(\|var\|primary\|secondary\|tertiary\)def\>:\<enddef\>,' .
+        \ '\<beginfig\>:\<endfig\>,' .
+        \ '\<begingroup\>:\<endgroup\>,' .
+        \ '\<beginchar\>:\<endchar\>' .
+        \ '\<beginlogochar\>:\<endlogochar\>' .
+        \ '\<beginglyph\>:\<endglyph\>' .
+        \ '\<begingraph\>:\<endgraph\>'
+  " Ignore comments and strings
+  let b:match_skip = 'synIDattr(synID(line("."), col("."), 1), "name")
+        \ =~# "^mf\\%(Comment\\|String\\|\\)$\\|^mpTeXinsert$"'
+endif
+
 let &cpo = s:cpo_save
 unlet s:cpo_save
--- a/runtime/indent/fortran.vim
+++ b/runtime/indent/fortran.vim
@@ -1,11 +1,12 @@
 " Vim indent file
 " Language:	Fortran 2008 (and older: Fortran 2003, 95, 90, and 77)
-" Version:	0.45
-" Last Change:	2016 Aug. 29
+" Version:	0.46
+" Last Change:	2016 Sep. 27
 " Maintainer:	Ajit J. Thakkar <ajit@unb.ca>; <http://www2.unb.ca/~ajit/>
 " Usage:	For instructions, do :help fortran-indent from Vim
 " Credits:
-"  Useful suggestions were made by: Albert Oliver Serra and Takuya Fujiwara.
+"  Useful suggestions were made, in chronological order, by:
+"  Albert Oliver Serra, Takuya Fujiwara and Philipp Edelmann.
 
 " Only load this indent file when no other was loaded.
 if exists("b:did_indent")
@@ -121,7 +122,8 @@ function FortranGetIndent(lnum)
     let prefix='\(\(pure\|impure\|elemental\|recursive\)\s\+\)\{,2}'
     let type='\(\(integer\|real\|double\s\+precision\|complex\|logical'
           \.'\|character\|type\|class\)\s*\S*\s\+\)\='
-    if prevstat =~? '^\s*\(module\|contains\/submodule\|program\)\>'
+    if prevstat =~? '^\s*\(contains\|submodule\|program\)\>'
+            \ ||prevstat =~? '^\s*'.'module\>\(\s*\procedure\)\@!'
             \ ||prevstat =~? '^\s*'.prefix.'subroutine\>'
             \ ||prevstat =~? '^\s*'.prefix.type.'function\>'
             \ ||prevstat =~? '^\s*'.type.prefix.'function\>'
@@ -129,7 +131,7 @@ function FortranGetIndent(lnum)
     endif
     if getline(v:lnum) =~? '^\s*contains\>'
           \ ||getline(v:lnum)=~? '^\s*end\s*'
-          \ .'\(function\|subroutine\|module\/submodule\|program\)\>'
+          \ .'\(function\|subroutine\|module\|submodule\|program\)\>'
       let ind = ind - shiftwidth()
     endif
   endif
new file mode 100644
--- /dev/null
+++ b/runtime/indent/mf.vim
@@ -0,0 +1,6 @@
+" METAFONT indent file
+" Language:    METAFONT
+" Maintainer:  Nicola Vitacolonna <nvitacolonna@gmail.com>
+" Last Change: 2016 Oct 1
+
+runtime! indent/mp.vim
--- a/runtime/indent/mp.vim
+++ b/runtime/indent/mp.vim
@@ -1,56 +1,19 @@
 " MetaPost indent file
-" Language:	MetaPost
-" Maintainer:	Eugene Minkovskii <emin@mccme.ru>
-" Last Change:	2012 May 18
-" Version: 0.1
-" ==========================================================================
+" Language:           MetaPost
+" Maintainer:         Nicola Vitacolonna <nvitacolonna@gmail.com>
+" Former Maintainers: Eugene Minkovskii <emin@mccme.ru>
+" Last Change:        2016 Oct 01
+" Version: 0.2
 
-" Identation Rules: {{{1
-" First of all, MetaPost language don't expect any identation rules.
-" This screept need for you only if you (not MetaPost) need to do
-" exactly code. If you don't need to use indentation, see
-" :help filetype-indent-off
-"
-" Note: Every rules of identation in MetaPost or TeX languages (and in some
-" other of course) is very subjective. I can release only my vision of this
-" promlem.
-"
-" ..........................................................................
-" Example of correct (by me) identation {{{2
-" shiftwidth=4
-" ==========================================================================
-" for i=0 upto 99:
-"     z[i] = (0,1u) rotated (i*360/100);
-" endfor
-" draw z0 -- z10 -- z20
-"         withpen ...     % <- 2sw because breaked line
-"         withcolor ...;  % <- same as previous
-" draw z0 for i=1 upto 99:
-"             -- z[i]             % <- 1sw from left end of 'for' satement
-"         endfor withpen ...      % <- 0sw from left end of 'for' satement
-"                 withcolor ...;  % <- 2sw because breaked line
-" draw if One:     % <- This is internal if (like 'for' above)
-"          one
-"      elsif Other:
-"          other
-"      fi withpen ...;
-" if one:          % <- This is external if
-"     draw one;
-" elseif other:
-"     draw other;
-" fi
-" draw z0; draw z1;
-" }}}
-" }}}
-
-" Only load this indent file when no other was loaded.
 if exists("b:did_indent")
   finish
 endif
 let b:did_indent = 1
 
 setlocal indentexpr=GetMetaPostIndent()
-setlocal indentkeys+=;,<:>,=if,=for,=def,=end,=else,=fi
+setlocal indentkeys+==end,=else,=fi,=fill,0),0]
+
+let b:undo_indent = "setl indentkeys< indentexpr<"
 
 " Only define the function once.
 if exists("*GetMetaPostIndent")
@@ -59,151 +22,332 @@ endif
 let s:keepcpo= &cpo
 set cpo&vim
 
-" Auxiliary Definitions: {{{1
-function! MetaNextNonblankNoncomment(pos)
-  " Like nextnonblank() but ignore comment lines
-  let tmp = nextnonblank(a:pos)
-  while tmp && getline(tmp) =~ '^\s*%'
-    let tmp = nextnonblank(tmp+1)
+function GetMetaPostIndent()
+  let ignorecase_save = &ignorecase
+  try
+    let &ignorecase = 0
+    return GetMetaPostIndentIntern()
+  finally
+    let &ignorecase = ignorecase_save
+  endtry
+endfunc
+
+" Regexps {{{
+" Note: the next three variables are made global so that a user may add
+" further keywords.
+"
+" Example:
+"
+"    Put these in ~/.vim/after/indent/mp.vim
+"
+"    let g:mp_open_tag .= '\|\<begintest\>'
+"    let g:mp_close_tag .= '\|\<endtest\>'
+
+" Expressions starting indented blocks
+let g:mp_open_tag = ''
+      \ . '\<if\>'
+      \ . '\|\<else\%[if]\>'
+      \ . '\|\<for\%(\|ever\|suffixes\)\>'
+      \ . '\|\<begingroup\>'
+      \ . '\|\<\%(\|var\|primary\|secondary\|tertiary\)def\>'
+      \ . '\|^\s*\<begin\%(fig\|graph\|glyph\|char\|logochar\)\>'
+      \ . '\|[([{]'
+
+" Expressions ending indented blocks
+let g:mp_close_tag = ''
+      \ . '\<fi\>'
+      \ . '\|\<else\%[if]\>'
+      \ . '\|\<end\%(\|for\|group\|def\|fig\|char\|logochar\|glyph\|graph\)\>'
+      \ . '\|[)\]}]'
+
+" Statements that may span multiple lines and are ended by a semicolon. To
+" keep this list short, statements that are unlikely to be very long or are
+" not very common (e.g., keywords like `interim` or `showtoken`) are not
+" included.
+"
+" The regex for assignments and equations (the last branch) is tricky, because
+" it must not match things like `for i :=`, `if a=b`, `def...=`, etc... It is
+" not perfect, but it works reasonably well.
+let g:mp_statement = ''
+      \ . '\<\%(\|un\|cut\)draw\>'
+      \ . '\|\<\%(\|un\)fill\%[draw]\>'
+      \ . '\|\<draw\%(dbl\)\=arrow\>'
+      \ . '\|\<clip\>'
+      \ . '\|\<addto\>'
+      \ . '\|\<save\>'
+      \ . '\|\<setbounds\>'
+      \ . '\|\<message\>'
+      \ . '\|\<errmessage\>'
+      \ . '\|\<errhelp\>'
+      \ . '\|\<fontmapline\>'
+      \ . '\|\<pickup\>'
+      \ . '\|\<show\>'
+      \ . '\|\<special\>'
+      \ . '\|\<write\>'
+      \ . '\|\%(^\|;\)\%([^;=]*\%('.g:mp_open_tag.'\)\)\@!.\{-}:\=='
+
+" A line ends with zero or more spaces, possibly followed by a comment.
+let s:eol = '\s*\%($\|%\)'
+" }}}
+
+" Auxiliary functions {{{
+" Returns 1 if (0-based) position immediately preceding `pos` in `line` is
+" inside a string or a comment; returns 0 otherwise.
+
+" This is the function that is called more often when indenting, so it is
+" critical that it is efficient. The method we use is significantly faster
+" than using syntax attributes, and more general (it does not require
+" syntax_items). It is also faster than using a single regex matching an even
+" number of quotes. It helps that MetaPost strings cannot span more than one
+" line and cannot contain escaped quotes.
+function! s:CommentOrString(line, pos)
+  let in_string = 0
+  let q = stridx(a:line, '"')
+  let c = stridx(a:line, '%')
+  while q >= 0 && q < a:pos
+    if c >= 0 && c < q
+      if in_string " Find next percent symbol
+        let c = stridx(a:line, '%', q + 1)
+      else " Inside comment
+        return 1
+      endif
+    endif
+    let in_string = 1 - in_string
+    let q = stridx(a:line, '"', q + 1) " Find next quote
   endwhile
-  return tmp
-endfunction
-
-function! MetaPrevNonblankNoncomment(pos)
-  " Like prevnonblank() but ignore comment lines
-  let tmp = prevnonblank(a:pos)
-  while tmp && getline(tmp) =~ '^\s*%'
-    let tmp = prevnonblank(tmp-1)
-  endwhile
-  return tmp
+  return in_string || (c >= 0 && c <= a:pos)
 endfunction
 
-function! MetaSearchNoncomment(pattern, ...)
-  " Like search() but ignore commented areas
-  if a:0
-    let flags = a:1
-  elseif &wrapscan
-    let flags = "w"
-  else
-    let flags = "W"
+" Find the first non-comment non-blank line before the current line. Skip also
+" verbatimtex/btex... etex blocks.
+function! s:PrevNonBlankNonComment(lnum)
+  let l:lnum = prevnonblank(a:lnum - 1)
+  while getline(l:lnum) =~# '^\s*%' ||
+        \ synIDattr(synID(a:lnum, 1, 1), "name") =~# '^mpTeXinsert$\|^tex\|^Delimiter'
+    let l:lnum = prevnonblank(l:lnum - 1)
+  endwhile
+  return l:lnum
+endfunction
+
+" Returns true if the last tag appearing in the line is an open tag; returns
+" false otherwise.
+function! s:LastTagIsOpen(line)
+  let o = s:LastValidMatchEnd(a:line, g:mp_open_tag, 0)
+  if o == - 1 | return v:false | endif
+  return s:LastValidMatchEnd(a:line, g:mp_close_tag, o) < 0
+endfunction
+
+" A simple, efficient and quite effective heuristics is used to test whether
+" a line should cause the next line to be indented: count the "opening tags"
+" (if, for, def, ...) in the line, count the "closing tags" (endif, endfor,
+" ...) in the line, and compute the difference. We call the result the
+" "weight" of the line. If the weight is positive, then the next line should
+" most likely be indented. Note that `else` and `elseif` are both opening and
+" closing tags, so they "cancel out" in almost all cases, the only exception
+" being a leading `else[if]`, which is counted as an opening tag, but not as
+" a closing tag (so that, for instance, a line containing a single `else:`
+" will have weight equal to one, not zero). We do not treat a trailing
+" `else[if]` in any special way, because lines ending with an open tag are
+" dealt with separately before this function is called (see
+" GetMetaPostIndentIntern()).
+"
+" Example:
+"
+"     forsuffixes $=a,b: if x.$ = y.$ : draw else: fill fi
+"       % This line will be indented because |{forsuffixes,if,else}| > |{else,fi}| (3 > 2)
+"     endfor
+
+function! s:Weight(line)
+  let [o, i] = [0, s:ValidMatchEnd(a:line, g:mp_open_tag, 0)]
+  while i > 0
+    let o += 1
+    let i = s:ValidMatchEnd(a:line, g:mp_open_tag, i)
+  endwhile
+  let [c, i] = [0, matchend(a:line, '^\s*\<else\%[if]\>')] " Skip a leading else[if]
+  let i = s:ValidMatchEnd(a:line, g:mp_close_tag, i)
+  while i > 0
+    let c += 1
+    let i = s:ValidMatchEnd(a:line, g:mp_close_tag, i)
+  endwhile
+  return o - c
+endfunction
+
+" Similar to matchend(), but skips strings and comments.
+" line: a String
+function! s:ValidMatchEnd(line, pat, start)
+  let i = matchend(a:line, a:pat, a:start)
+  while i > 0 && s:CommentOrString(a:line, i)
+    let i = matchend(a:line, a:pat, i)
+  endwhile
+  return i
+endfunction
+
+" Like s:ValidMatchEnd(), but returns the end position of the last (i.e.,
+" rightmost) match.
+function! s:LastValidMatchEnd(line, pat, start)
+  let last_found = -1
+  let i = matchend(a:line, a:pat, a:start)
+  while i > 0
+    if !s:CommentOrString(a:line, i)
+      let last_found = i
+    endif
+    let i = matchend(a:line, a:pat, i)
+  endwhile
+  return last_found
+endfunction
+
+function! s:DecreaseIndentOnClosingTag(curr_indent)
+  let cur_text = getline(v:lnum)
+  if cur_text =~# '^\s*\%('.g:mp_close_tag.'\)'
+    return max([a:curr_indent - shiftwidth(), 0])
   endif
-  let cl  = line(".")
-  let cc  = col(".")
-  let tmp = search(a:pattern, flags)
-  while tmp && synIDattr(synID(line("."), col("."), 1), "name") =~
-        \ 'm[fp]\(Comment\|TeXinsert\|String\)'
-    let tmp = search(a:pattern, flags)
-  endwhile
-  if !tmp
-    call cursor(cl,cc)
-  endif
-  return tmp
+  return a:curr_indent
 endfunction
 " }}}
 
-function! GetMetaPostIndent()
-  " not indent in comment ???
-  if synIDattr(synID(line("."), col("."), 1), "name") =~
-        \ 'm[fp]\(Comment\|TeXinsert\|String\)'
-    return -1
-  endif
-  " Some RegExps: {{{1
-  " end_of_item: all of end by ';'
-  "            + all of end by :endfor, :enddef, :endfig, :endgroup, :fi
-  "            + all of start by :beginfig(num), :begingroup
-  "            + all of start by :for, :if, :else, :elseif and end by ':'
-  "            + all of start by :def, :vardef             and end by '='
-  let end_of_item = '\('                              .
-        \ ';\|'                                       .
-        \ '\<\(end\(for\|def\|fig\|group\)\|fi\)\>\|' .
-        \ '\<begin\(group\>\|fig\s*(\s*\d\+\s*)\)\|'  .
-        \ '\<\(for\|if\|else\(if\)\=\)\>.\+:\|'       .
-        \ '\<\(var\)\=def\>.\+='                      . '\)'
-  " }}}
-  " Save: current position {{{1
-  let cl = line   (".")
-  let cc = col    (".")
-  let cs = getline(".")
-  " if it is :beginfig or :endfig use zero indent
-  if  cs =~ '^\s*\(begin\|end\)fig\>'
-    return 0
-  endif
-  " }}}
-  " Initialise: ind variable {{{1
-  " search previous item not in current line
-  let p_semicol_l = MetaSearchNoncomment(end_of_item,"bW")
-  while p_semicol_l == cl
-    let p_semicol_l = MetaSearchNoncomment(end_of_item,"bW")
-  endwhile
-  " if this is first item in program use zero indent
-  if !p_semicol_l
+" Main function {{{
+"
+" Note: Every rule of indentation in MetaPost is very subjective. We might get
+" creative, but things get murky very soon (there are too many corner cases).
+" So, we provide a means for the user to decide what to do when this script
+" doesn't get it. We use a simple idea: use '%>', '%<' and '%=' to explicitly
+" control indentation. The '<' and '>' symbols may be repeated many times
+" (e.g., '%>>' will cause the next line to be indented twice).
+"
+" By using '%>...', '%<...' and '%=', the indentation the user wants is
+" preserved by commands like gg=G, even if it does not follow the rules of
+" this script.
+"
+" Example:
+"
+"    shiftwidth=4
+"    def foo =
+"        makepen(subpath(T-n,t) of r %>
+"            shifted .5down %>
+"                --subpath(t,T) of r shifted .5up -- cycle) %<<
+"        withcolor black
+"    enddef
+"
+" The default indentation of the previous example would be:
+"
+"    def foo =
+"        makepen(subpath(T-n,t) of r
+"        shifted .5down
+"        --subpath(t,T) of r shifted .5up -- cycle)
+"        withcolor black
+"    enddef
+"
+" Personally, I prefer the latter, but anyway...
+function! GetMetaPostIndentIntern()
+
+  " This is the reference line relative to which the current line is indented
+  " (but see below).
+  let lnum = s:PrevNonBlankNonComment(v:lnum)
+
+  " At the start of the file use zero indent.
+  if lnum == 0
     return 0
   endif
-  " if this is multiline item, remember first indent
-  if MetaNextNonblankNoncomment(p_semicol_l+1) < cl
-    let ind = indent(MetaNextNonblankNoncomment(p_semicol_l+1))
-  " else --- search pre-previous item for search first line in previous item
-  else
-    " search pre-previous item not in current line
-    let pp_semicol_l = MetaSearchNoncomment(end_of_item,"bW")
-    while pp_semicol_l == p_semicol_l
-      let pp_semicol_l = MetaSearchNoncomment(end_of_item,"bW")
-    endwhile
-    " if we find pre-previous item, remember indent of previous item
-    " else --- remember zero
-    if pp_semicol_l
-      let ind = indent(MetaNextNonblankNoncomment(line(".")+1))
-    else
-      let ind = 0
+
+  let prev_text = getline(lnum)
+
+  " User-defined overrides take precedence over anything else.
+  " See above for an example.
+  let j = match(prev_text, '%[<>=]')
+  if j > 0
+    let i = strlen(matchstr(prev_text, '%>\+', j)) - 1
+    if i > 0
+      return indent(lnum) + i * shiftwidth()
+    endif
+
+    let i = strlen(matchstr(prev_text, '%<\+', j)) - 1
+    if i > 0
+      return max([indent(lnum) - i * shiftwidth(), 0])
+    endif
+
+    if match(prev_text, '%=', j)
+      return indent(lnum)
     endif
   endif
-  " }}}
-  " Increase Indent: {{{1
-  " if it is an internal/external :for or :if statements {{{2
-  let pnn_s = getline(MetaPrevNonblankNoncomment(cl-1))
-  if  pnn_s =~ '\<\(for\|if\)\>.\+:\s*\($\|%\)'
-    let ind = match(pnn_s, '\<\(for\|if\)\>.\+:\s*\($\|%\)') + &sw
-  " }}}
-  " if it is a :def, :vardef, :beginfig, :begingroup, :else, :elseif {{{2
-  elseif pnn_s =~ '^\s*\('                       .
-        \ '\(var\)\=def\|'                       .
-        \ 'begin\(group\|fig\s*(\s*\d\+\s*)\)\|' .
-        \ 'else\(if\)\='                         . '\)\>'
-    let ind = ind + &sw
-  " }}}
-  " if it is a broken line {{{2
-  elseif pnn_s !~ end_of_item.'\s*\($\|%\)'
-    let ind = ind + (2 * &sw)
+
+  " If the reference line ends with an open tag, indent.
+  "
+  " Example:
+  "
+  " if c:
+  "     0
+  " else:
+  "     1
+  " fi if c2: % Note that this line has weight equal to zero.
+  "     ...   % This line will be indented
+  if s:LastTagIsOpen(prev_text)
+    return s:DecreaseIndentOnClosingTag(indent(lnum) + shiftwidth())
+  endif
+
+  " Lines with a positive weight are unbalanced and should likely be indented.
+  "
+  " Example:
+  "
+  " def f = enddef for i = 1 upto 5: if x[i] > 0: 1 else: 2 fi
+  "     ... % This line will be indented (because of the unterminated `for`)
+  if s:Weight(prev_text) > 0
+    return s:DecreaseIndentOnClosingTag(indent(lnum) + shiftwidth())
   endif
-  " }}}
-  " }}}
-  " Decrease Indent: {{{1
-  " if this is :endfor or :enddef statements {{{2
-  " this is correct because :def cannot be inside :for
-  if  cs  =~ '\<end\(for\|def\)\=\>'
-    call MetaSearchNoncomment('\<for\>.\+:\s*\($\|%\)' . '\|' .
-                            \ '^\s*\(var\)\=def\>',"bW")
-    if col(".") > 1
-      let ind = col(".") - 1
+
+  " Unterminated statements cause indentation to kick in.
+  "
+  " Example:
+  "
+  " draw unitsquare
+  "     withcolor black; % This line is indented because of `draw`.
+  " x := a + b + c
+  "     + d + e;         % This line is indented because of `:=`.
+  "
+  let i = s:LastValidMatchEnd(prev_text, g:mp_statement, 0)
+  if i >= 0 " Does the line contain a statement?
+    if s:ValidMatchEnd(prev_text, ';', i) < 0 " Is the statement unterminated?
+      return indent(lnum) + shiftwidth()
     else
-      let ind = indent(".")
+      return s:DecreaseIndentOnClosingTag(indent(lnum))
     endif
-  " }}}
-  " if this is :fi, :else, :elseif statements {{{2
-  elseif cs =~ '\<\(else\(if\)\=\|fi\)\>'
-    call MetaSearchNoncomment('\<if\>.\+:\s*\($\|%\)',"bW")
-    let ind = col(".") - 1
-  " }}}
-  " if this is :endgroup statement {{{2
-  elseif cs =~ '^\s*endgroup\>'
-    let ind = ind - &sw
   endif
-  " }}}
-  " }}}
 
-  return ind
+  " Deal with the special case of a statement spanning multiple lines. If the
+  " current reference line L ends with a semicolon, search backwards for
+  " another semicolon or a statement keyword. If the latter is found first,
+  " its line is used as the reference line for indenting the current line
+  " instead of L.
+  "
+  "  Example:
+  "
+  "  if cond:
+  "    draw if a: z0 else: z1 fi
+  "        shifted S
+  "        scaled T;      % L
+  "
+  "    for i = 1 upto 3:  % <-- Current line: this gets the same indent as `draw ...`
+  "
+  " NOTE: we get here if and only if L does not contain a statement (among
+  " those listed in g:mp_statement).
+  if s:ValidMatchEnd(prev_text, ';'.s:eol, 0) >= 0 " L ends with a semicolon
+    let stm_lnum = s:PrevNonBlankNonComment(lnum)
+    while stm_lnum > 0
+      let prev_text = getline(stm_lnum)
+      let sc_pos = s:LastValidMatchEnd(prev_text, ';', 0)
+      let stm_pos = s:ValidMatchEnd(prev_text, g:mp_statement, sc_pos)
+      if stm_pos > sc_pos
+        let lnum = stm_lnum
+        break
+      elseif sc_pos > stm_pos
+        break
+      endif
+      let stm_lnum = s:PrevNonBlankNonComment(stm_lnum)
+    endwhile
+  endif
+
+  return s:DecreaseIndentOnClosingTag(indent(lnum))
 endfunction
-"
+" }}}
 
 let &cpo = s:keepcpo
 unlet s:keepcpo
--- a/runtime/syntax/debsources.vim
+++ b/runtime/syntax/debsources.vim
@@ -2,7 +2,7 @@
 " Language:     Debian sources.list
 " Maintainer:   Debian Vim Maintainers <pkg-vim-maintainers@lists.alioth.debian.org>
 " Former Maintainer: Matthijs Mohlmann <matthijs@cacholong.nl>
-" Last Change: 2016 Aug 30
+" Last Change: 2016 Sep 27
 " URL: https://anonscm.debian.org/cgit/pkg-vim/vim.git/plain/runtime/syntax/debsources.vim
 
 " Standard syntax initialization
@@ -39,7 +39,7 @@ let s:unsupported = [
 let &cpo=s:cpo
 
 " Match uri's
-syn match debsourcesUri            +\(http://\|ftp://\|[rs]sh://\|debtorrent://\|\(cdrom\|copy\|file\):\)[^' 	<>"]\++
+syn match debsourcesUri            +\(https\?://\|ftp://\|[rs]sh://\|debtorrent://\|\(cdrom\|copy\|file\):\)[^' 	<>"]\++
 exe 'syn match debsourcesDistrKeyword   +\([[:alnum:]_./]*\)\('. join(s:supported, '\|'). '\)\([-[:alnum:]_./]*\)+'
 exe 'syn match debsourcesUnsupportedDistrKeyword +\([[:alnum:]_./]*\)\('. join(s:unsupported, '\|') .'\)\([-[:alnum:]_./]*\)+'
 
--- a/runtime/syntax/mf.vim
+++ b/runtime/syntax/mf.vim
@@ -1,184 +1,295 @@
 " Vim syntax file
-" Language:	Metafont
-" Maintainer:	Andreas Scherer <andreas.scherer@pobox.com>
-" Last Change:	April 25, 2001
+" Language:           METAFONT
+" Maintainer:         Nicola Vitacolonna <nvitacolonna@gmail.com>
+" Former Maintainers: Andreas Scherer <andreas.scherer@pobox.com>
+" Last Change:        2016 Oct 1
 
-" quit when a syntax file was already loaded
 if exists("b:current_syntax")
   finish
 endif
 
-" Metafont 'primitives' as defined in chapter 25 of 'The METAFONTbook'
+syn iskeyword @,_
+
+" METAFONT 'primitives' as defined in chapter 25 of 'The METAFONTbook'
 " Page 210: 'boolean expressions'
-syn keyword mfBoolExp true false known unknown odd charexists not and or
+syn keyword mfBoolExp        and charexists false known not odd or true unknown
 
 " Page 210: 'numeric expression'
-syn keyword mfNumExp normaldeviate length ASCII oct hex angle turningnumber
-syn keyword mfNumExp totalweight directiontime xpart ypart xxpart xypart
-syn keyword mfNumExp yxpart yypart sqrt sind cosd mlog mexp floor
-syn keyword mfNumExp uniformdeviate
+syn keyword mfNumExp         ASCII angle cosd directiontime floor hex length
+syn keyword mfNumExp         mexp mlog normaldeviate oct sind sqrt totalweight
+syn keyword mfNumExp         turningnumber uniformdeviate xpart xxpart xypart
+syn keyword mfNumExp         ypart yxpart yypart
 
 " Page 211: 'internal quantities'
-syn keyword mfInternal tracingtitles tracingequations tracingcapsules
-syn keyword mfInternal tracingchoices tracingspecs tracingpens
-syn keyword mfInternal tracingcommands tracingrestores tracingmacros
-syn keyword mfInternal tracingedges tracingoutput tracingonline tracingstats
-syn keyword mfInternal pausing showstopping fontmaking proofing
-syn keyword mfInternal turningcheck warningcheck smoothing autorounding
-syn keyword mfInternal granularity fillin year month day time
-syn keyword mfInternal charcode charext charwd charht chardp charic
-syn keyword mfInternal chardx chardy designsize hppp vppp xoffset yoffset
-syn keyword mfInternal boundarychar
+syn keyword mfInternal       autorounding boundarychar charcode chardp chardx
+syn keyword mfInternal       chardy charext charht charic charwd day designsize
+syn keyword mfInternal       fillin fontmaking granularity hppp jobname month
+syn keyword mfInternal       pausing proofing showstopping smoothing time
+syn keyword mfInternal       tracingcapsules tracingchoices tracingcommands
+syn keyword mfInternal       tracingedges tracingequations tracingmacros
+syn keyword mfInternal       tracingonline tracingoutput tracingpens
+syn keyword mfInternal       tracingrestores tracingspecs tracingstats
+syn keyword mfInternal       tracingtitles turningcheck vppp warningcheck
+syn keyword mfInternal       xoffset year yoffset
 
 " Page 212: 'pair expressions'
-syn keyword mfPairExp point of precontrol postcontrol penoffset rotated
-syn keyword mfPairExp scaled shifted slanted transformed xscaled yscaled
-syn keyword mfPairExp zscaled
+syn keyword mfPairExp        of penoffset point postcontrol precontrol rotated
+syn keyword mfPairExp        scaled shifted slanted transformed xscaled yscaled
+syn keyword mfPairExp        zscaled
 
 " Page 213: 'path expressions'
-syn keyword mfPathExp makepath reverse subpath curl tension atleast
-syn keyword mfPathExp controls cycle
+syn keyword mfPathExp        atleast controls curl cycle makepath reverse
+syn keyword mfPathExp        subpath tension
 
 " Page 214: 'pen expressions'
-syn keyword mfPenExp nullpen pencircle makepen
+syn keyword mfPenExp         makepen nullpen pencircle
 
-" Page 214: 'picutre expressions'
-syn keyword mfPicExp nullpicture
+" Page 214: 'picture expressions'
+syn keyword mfPicExp         nullpicture
 
 " Page 214: 'string expressions'
-syn keyword mfStringExp jobname readstring str char decimal substring
+syn keyword mfStringExp      char decimal readstring str substring
 
 " Page 217: 'commands and statements'
-syn keyword mfCommand end dump save interim newinternal randomseed let
-syn keyword mfCommand delimiters outer everyjob show showvariable showtoken
-syn keyword mfCommand showdependencies showstats message errmessage errhelp
-syn keyword mfCommand batchmode nonstopmode scrollmode errorstopmode
-syn keyword mfCommand addto also contour doublepath withpen withweight cull
-syn keyword mfCommand keeping dropping display inwindow openwindow at from to
-syn keyword mfCommand shipout special numspecial
+syn keyword mfCommand        addto also at batchmode contour cull delimiters
+syn keyword mfCommand        display doublepath dropping dump end errhelp
+syn keyword mfCommand        errmessage errorstopmode everyjob from interim
+syn keyword mfCommand        inwindow keeping let message newinternal
+syn keyword mfCommand        nonstopmode numspecial openwindow outer randomseed
+syn keyword mfCommand        save scrollmode shipout show showdependencies
+syn keyword mfCommand        showstats showtoken showvariable special to withpen
+syn keyword mfCommand        withweight
 
 " Page 56: 'types'
-syn keyword mfType boolean numeric pair path pen picture string transform
+syn keyword mfType           boolean numeric pair path pen picture string
+syn keyword mfType           transform
 
 " Page 155: 'grouping'
-syn keyword mfStatement begingroup endgroup
+syn keyword mfStatement      begingroup endgroup
 
 " Page 165: 'definitions'
-syn keyword mfDefinition enddef def expr suffix text primary secondary
-syn keyword mfDefinition tertiary vardef primarydef secondarydef tertiarydef
+syn keyword mfDefinition     def enddef expr primary primarydef secondary
+syn keyword mfDefinition     secondarydef suffix tertiary tertiarydef text
+syn keyword mfDefinition     vardef
 
 " Page 169: 'conditions and loops'
-syn keyword mfCondition if fi else elseif endfor for forsuffixes forever
-syn keyword mfCondition step until exitif
+syn keyword mfCondition      else elseif endfor exitif fi for forever
+syn keyword mfCondition      forsuffixes if step until
 
 " Other primitives listed in the index
-syn keyword mfPrimitive charlist endinput expandafter extensible
-syn keyword mfPrimitive fontdimen headerbyte inner input intersectiontimes
-syn keyword mfPrimitive kern ligtable quote scantokens skipto
+syn keyword mfPrimitive      charlist endinput expandafter extensible fontdimen
+syn keyword mfPrimitive      headerbyte inner input intersectiontimes kern
+syn keyword mfPrimitive      ligtable quote scantokens skipto
+
+" Implicit suffix parameters
+syn match   mfSuffixParam    "@#\|#@\|@"
+
+" These are just tags, but given their special status, we
+" highlight them as variables
+syn keyword mfVariable       x y
 
 " Keywords defined by plain.mf (defined on pp.262-278)
-if !exists("plain_mf_macros")
-  let plain_mf_macros = 1 " Set this to '0' if your source gets too colourful
-			  " metapost.vim does so to turn off Metafont macros
+if get(g:, "plain_mf_macros", 1)
+  syn keyword mfDef          addto_currentpicture beginchar capsule_def
+  syn keyword mfDef          change_width clear_pen_memory clearit clearpen
+  syn keyword mfDef          clearxy culldraw cullit cutdraw
+  syn keyword mfDef          define_blacker_pixels define_corrected_pixels
+  syn keyword mfDef          define_good_x_pixels define_good_y_pixels
+  syn keyword mfDef          define_horizontal_corrected_pixels define_pixels
+  syn keyword mfDef          define_whole_blacker_pixels define_whole_pixels
+  syn keyword mfDef          define_whole_vertical_blacker_pixels
+  syn keyword mfDef          define_whole_vertical_pixels downto draw drawdot
+  syn keyword mfDef          endchar erase exitunless fill filldraw fix_units
+  syn keyword mfDef          flex font_coding_scheme font_extra_space
+  syn keyword mfDef          font_identifier font_normal_shrink
+  syn keyword mfDef          font_normal_space font_normal_stretch font_quad
+  syn keyword mfDef          font_size font_slant font_x_height gfcorners gobble
+  syn keyword mfDef          hide imagerules interact italcorr killtext
+  syn keyword mfDef          loggingall lowres_fix makebox makegrid maketicks
+  syn keyword mfDef          mode_def mode_setup nodisplays notransforms numtok
+  syn keyword mfDef          openit penrazor pensquare penstroke pickup
+  syn keyword mfDef          proofoffset proofrule range reflectedabout
+  syn keyword mfDef          rotatedaround screenchars screenrule screenstrokes
+  syn keyword mfDef          shipit showit smode stop superellipse takepower
+  syn keyword mfDef          tracingall tracingnone undraw undrawdot unfill
+  syn keyword mfDef          unfilldraw upto z
+  syn match   mfDef          "???"
+  syn keyword mfVardef       bot byte ceiling counterclockwise cutoff decr dir
+  syn keyword mfVardef       direction directionpoint grayfont hround incr
+  syn keyword mfVardef       interpath inverse labelfont labels lft magstep
+  " Note: nodot is not a vardef, it is used as in makelabel.lft.nodot("5",z5)
+  " (METAFONT only)
+  syn keyword mfVardef       makelabel max min nodot penlabels penpos
+  syn keyword mfVardef       proofrulethickness round rt savepen slantfont solve
+  syn keyword mfVardef       tensepath titlefont top unitvector vround whatever
+  syn match   mpVardef       "\<good\.\%(x\|y\|lft\|rt\|top\|bot\)\>"
+  syn keyword mfPrimaryDef   div dotprod gobbled mod
+  syn keyword mfSecondaryDef intersectionpoint
+  syn keyword mfTertiaryDef  softjoin thru
+  syn keyword mfNewInternal  blacker currentwindow displaying eps epsilon
+  syn keyword mfNewInternal  infinity join_radius number_of_modes o_correction
+  syn keyword mfNewInternal  pen_bot pen_lft pen_rt pen_top pixels_per_inch
+  syn keyword mfNewInternal  screen_cols screen_rows tolerance
+  " Predefined constants
+  syn keyword mfConstant     base_name base_version blankpicture ditto down
+  syn keyword mfConstant     fullcircle halfcircle identity left lowres origin
+  syn keyword mfConstant     penspeck proof quartercircle right rulepen smoke
+  syn keyword mfConstant     unitpixel unitsquare up
+  " Other predefined variables
+  syn keyword mfVariable     aspect_ratio currentpen extra_beginchar
+  syn keyword mfVariable     extra_endchar currentpen_path currentpicture
+  syn keyword mfVariable     currenttransform d extra_setup h localfont mag mode
+  syn keyword mfVariable     mode_name w
+  " let statements:
+  syn keyword mfnumExp       abs
+  syn keyword mfPairExp      rotatedabout
+  syn keyword mfCommand      bye relax
 endif
-if plain_mf_macros
-  syn keyword mfMacro abs addto_currentpicture aspect_ratio base_name
-  syn keyword mfMacro base_version beginchar blacker blankpicture bot bye byte
-  syn keyword mfMacro capsule_def ceiling change_width clear_pen_memory clearit
-  syn keyword mfMacro clearpen clearxy counterclockwise culldraw cullit
-  syn keyword mfMacro currentpen currentpen_path currentpicture
-  syn keyword mfMacro currenttransform currentwindow cutdraw cutoff d decr
-  syn keyword mfMacro define_blacker_pixels define_corrected_pixels
-  syn keyword mfMacro define_good_x_pixels define_good_y_pixels
-  syn keyword mfMacro define_horizontal_corrected_pixels define_pixels
-  syn keyword mfMacro define_whole_blacker_pixels define_whole_pixels
-  syn keyword mfMacro define_whole_vertical_blacker_pixels
-  syn keyword mfMacro define_whole_vertical_pixels dir direction directionpoint
-  syn keyword mfMacro displaying ditto div dotprod down downto draw drawdot
-  syn keyword mfMacro endchar eps epsilon extra_beginchar extra_endchar
-  syn keyword mfMacro extra_setup erase exitunless fill filldraw fix_units flex
-  syn keyword mfMacro font_coding_scheme font_extra_space font_identifier
-  syn keyword mfMacro font_normal_shrink font_normal_space font_normal_stretch
-  syn keyword mfMacro font_quad font_setup font_size font_slant font_x_height
-  syn keyword mfMacro fullcircle generate gfcorners gobble gobbled grayfont h
-  syn keyword mfMacro halfcircle hide hround identity image_rules incr infinity
-  syn keyword mfMacro interact interpath intersectionpoint inverse italcorr
-  syn keyword mfMacro join_radius killtext labelfont labels left lft localfont
-  syn keyword mfMacro loggingall lowres lowres_fix mag magstep makebox makegrid
-  syn keyword mfMacro makelabel maketicks max min mod mode mode_def mode_name
-  syn keyword mfMacro mode_setup nodisplays notransforms number_of_modes numtok
-  syn keyword mfMacro o_correction openit origin pen_bot pen_lft pen_rt pen_top
-  syn keyword mfMacro penlabels penpos penrazor penspeck pensquare penstroke
-  syn keyword mfMacro pickup pixels_per_inch proof proofoffset proofrule
-  syn keyword mfMacro proofrulethickness quartercircle range reflectedabout
-  syn keyword mfMacro relax right rotatedabout rotatedaround round rt rulepen
-  syn keyword mfMacro savepen screenchars screen_rows screen_cols screenrule
-  syn keyword mfMacro screenstrokes shipit showit slantfont smode smoke softjoin
-  syn keyword mfMacro solve stop superellipse takepower tensepath titlefont
-  syn keyword mfMacro tolerance top tracingall tracingnone undraw undrawdot
-  syn keyword mfMacro unfill unfilldraw unitpixel unitsquare unitvector up upto
-  syn keyword mfMacro vround w whatever
+
+" By default, METAFONT loads modes.mf, too
+if get(g:, "plain_mf_modes", 1)
+  syn keyword mfConstant     APSSixMed AgfaFourZeroZero AgfaThreeFourZeroZero
+  syn keyword mfConstant     AtariNineFive AtariNineSix AtariSLMEightZeroFour
+  syn keyword mfConstant     AtariSMOneTwoFour CItohEightFiveOneZero
+  syn keyword mfConstant     CItohThreeOneZero CanonBJCSixZeroZero CanonCX
+  syn keyword mfConstant     CanonEX CanonLBPLX CanonLBPTen CanonSX ChelgraphIBX
+  syn keyword mfConstant     CompugraphicEightSixZeroZero
+  syn keyword mfConstant     CompugraphicNineSixZeroZero DD DEClarge DECsmall
+  syn keyword mfConstant     DataDiscNew EightThree EpsonAction
+  syn keyword mfConstant     EpsonLQFiveZeroZeroLo EpsonLQFiveZeroZeroMed
+  syn keyword mfConstant     EpsonMXFX EpsonSQEightSevenZero EpsonStylusPro
+  syn keyword mfConstant     EpsonStylusProHigh EpsonStylusProLow
+  syn keyword mfConstant     EpsonStylusProMed FourFour GThreefax HPDeskJet
+  syn keyword mfConstant     HPLaserJetIIISi IBMFourTwoFiveZero IBMFourTwoOneSix
+  syn keyword mfConstant     IBMFourTwoThreeZero IBMFourZeroOneNine
+  syn keyword mfConstant     IBMFourZeroThreeNine IBMFourZeroTwoNine
+  syn keyword mfConstant     IBMProPrinter IBMSixOneFiveFour IBMSixSixSevenZero
+  syn keyword mfConstant     IBMThreeEightOneTwo IBMThreeEightTwoZero
+  syn keyword mfConstant     IBMThreeOneNineThree IBMThreeOneSevenNine
+  syn keyword mfConstant     IBMUlfHolleberg LASevenFive LNOthreR LNOthree
+  syn keyword mfConstant     LNZeroOne LNZeroThree LPSFourZero LPSTwoZero
+  syn keyword mfConstant     LexmarkFourZeroThreeNine LexmarkOptraR
+  syn keyword mfConstant     LexmarkOptraS LinotypeLThreeThreeZero
+  syn keyword mfConstant     LinotypeOneZeroZero LinotypeOneZeroZeroLo
+  syn keyword mfConstant     LinotypeThreeZeroZeroHi MacTrueSize NeXTprinter
+  syn keyword mfConstant     NeXTscreen NecTwoZeroOne Newgen NineOne
+  syn keyword mfConstant     OCESixSevenFiveZeroPS OneTwoZero OneZeroZero
+  syn keyword mfConstant     PrintwareSevenTwoZeroIQ Prism QMSOneSevenTwoFive
+  syn keyword mfConstant     QMSOneSevenZeroZero QMSTwoFourTwoFive RicohA
+  syn keyword mfConstant     RicohFortyEighty RicohFourZeroEightZero RicohLP
+  syn keyword mfConstant     SparcPrinter StarNLOneZero VAXstation VTSix
+  syn keyword mfConstant     VarityperFiveZeroSixZeroW
+  syn keyword mfConstant     VarityperFourThreeZeroZeroHi
+  syn keyword mfConstant     VarityperFourThreeZeroZeroLo
+  syn keyword mfConstant     VarityperFourTwoZeroZero VarityperSixZeroZero
+  syn keyword mfConstant     XeroxDocutech XeroxEightSevenNineZero
+  syn keyword mfConstant     XeroxFourZeroFiveZero XeroxNineSevenZeroZero
+  syn keyword mfConstant     XeroxPhaserSixTwoZeroZeroDP XeroxThreeSevenZeroZero
+  syn keyword mfConstant     Xerox_world agfafzz agfatfzz amiga aps apssixhi
+  syn keyword mfConstant     aselect atariezf atarinf atarins atariotf bitgraph
+  syn keyword mfConstant     bjtenex bjtzzex bjtzzl bjtzzs boise canonbjc
+  syn keyword mfConstant     canonex canonlbp cg cgl cgnszz citohtoz corona crs
+  syn keyword mfConstant     cthreeten cx datadisc declarge decsmall deskjet
+  syn keyword mfConstant     docutech dover dp dpdfezzz eighthre elvira epscszz
+  syn keyword mfConstant     epsdraft epsdrft epsdrftl epsfast epsfastl epshi
+  syn keyword mfConstant     epslo epsmed epsmedl epson epsonact epsonfx epsonl
+  syn keyword mfConstant     epsonlo epsonlol epsonlq epsonsq epstylus epstylwr
+  syn keyword mfConstant     epstyplo epstypmd epstypml epstypro epswlo epswlol
+  syn keyword mfConstant     esphi fourfour gpx gtfax gtfaxhi gtfaxl gtfaxlo
+  syn keyword mfConstant     gtfaxlol help hifax highfax hplaser hprugged ibm_a
+  syn keyword mfConstant     ibmd ibmega ibmegal ibmfzon ibmfztn ibmpp ibmppl
+  syn keyword mfConstant     ibmsoff ibmteot ibmtetz ibmtont ibmtosn ibmtosnl
+  syn keyword mfConstant     ibmvga ibx imagen imagewriter itoh itohl itohtoz
+  syn keyword mfConstant     itohtozl iw jetiiisi kyocera laserjet laserjetfive
+  syn keyword mfConstant     laserjetfivemp laserjetfour laserjetfourthousand
+  syn keyword mfConstant     laserjetfourzerozerozero laserjethi laserjetlo
+  syn keyword mfConstant     laserjettwoonezerozero
+  syn keyword mfConstant     laserjettwoonezerozerofastres lasermaster
+  syn keyword mfConstant     laserwriter lasf lexmarkr lexmarks lexmarku
+  syn keyword mfConstant     linohalf linohi linolo linolttz linoone linosuper
+  syn keyword mfConstant     linothree linothreelo linotzzh ljfive ljfivemp
+  syn keyword mfConstant     ljfour ljfzzz ljfzzzfr ljlo ljtozz ljtozzfr lmaster
+  syn keyword mfConstant     lnotr lnzo lps lpstz lqhires lqlores lqmed lqmedl
+  syn keyword mfConstant     lqmedres lview lviewl lwpro macmag mactrue modes_mf
+  syn keyword mfConstant     ncd nec nechi neclm nectzo newdd newddl nexthi
+  syn keyword mfConstant     nextscreen nextscrn nineone nullmode ocessfz
+  syn keyword mfConstant     okidata okidatal okifourten okifte okihi onetz
+  syn keyword mfConstant     onezz pcprevw pcscreen phaser phaserfs phasertf
+  syn keyword mfConstant     phasertfl phasertl pixpt printware prntware
+  syn keyword mfConstant     proprinter qms qmsesz qmsostf qmsoszz qmstftf ricoh
+  syn keyword mfConstant     ricoha ricohlp ricohsp sherpa sparcptr starnlt
+  syn keyword mfConstant     starnltl styletwo stylewr stylewri stylewriter sun
+  syn keyword mfConstant     supre swtwo toshiba ultre varityper vs vtftzz
+  syn keyword mfConstant     vtftzzhi vtftzzlo vtfzszw vtszz xpstzz xpstzzl
+  syn keyword mfConstant     xrxesnz xrxfzfz xrxnszz xrxtszz
+  syn keyword mfDef          BCPL_string coding_scheme font_face_byte
+  syn keyword mfDef          font_family landscape
+  syn keyword mfDef          mode_extra_info mode_help mode_param
+  syn keyword mfNewInternal  blacker_min
 endif
 
 " Some other basic macro names, e.g., from cmbase, logo, etc.
-if !exists("other_mf_macros")
-  let other_mf_macros = 1 " Set this to '0' if your code gets too colourful
-			  " metapost.vim does so to turn off Metafont macros
-endif
-if other_mf_macros
-  syn keyword mfMacro beginlogochar
+if get(g:, "other_mf_macros", 1)
+  syn keyword mfDef          beginlogochar
+  syn keyword mfDef          font_setup
+  syn keyword mfPrimitive    generate
 endif
 
 " Numeric tokens
-syn match mfNumeric	"[-]\=\d\+"
-syn match mfNumeric	"[-]\=\.\d\+"
-syn match mfNumeric	"[-]\=\d\+\.\d\+"
+syn match     mfNumeric      "[-]\=\d\+"
+syn match     mfNumeric      "[-]\=\.\d\+"
+syn match     mfNumeric      "[-]\=\d\+\.\d\+"
 
-" Metafont lengths
-syn match mfLength	"\<\(bp\|cc\|cm\|dd\|in\|mm\|pc\|pt\)\>"
-syn match mfLength	"\<[-]\=\d\+\(bp\|cc\|cm\|dd\|in\|mm\|pc\|pt\)\#\=\>"
-syn match mfLength	"\<[-]\=\.\d\+\(bp\|cc\|cm\|dd\|in\|mm\|pc\|pt\)\#\=\>"
-syn match mfLength	"\<[-]\=\d\+\.\d\+\(bp\|cc\|cm\|dd\|in\|mm\|pc\|pt\)\#\=\>"
-
-" Metafont coordinates and points
-syn match mfCoord	"\<[xy]\d\+\>"
-syn match mfPoint	"\<z\d\+\>"
+" METAFONT lengths
+syn match     mfLength       "\<\(bp\|cc\|cm\|dd\|in\|mm\|pc\|pt\)\>"
+syn match     mfLength       "[-]\=\d\+\(bp\|cc\|cm\|dd\|in\|mm\|pc\|pt\)\#\="
+syn match     mfLength       "[-]\=\.\d\+\(bp\|cc\|cm\|dd\|in\|mm\|pc\|pt\)\#\="
+syn match     mfLength       "[-]\=\d\+\.\d\+\(bp\|cc\|cm\|dd\|in\|mm\|pc\|pt\)\#\="
 
 " String constants
-syn region mfString	start=+"+ end=+"+
+syn match     mfOpenString   /"[^"]*/
+syn region    mfString       oneline keepend start=+"+ end=+"+
 
 " Comments:
-syn match mfComment	"%.*$"
+syn keyword   mfTodoComment  contained TODO FIXME XXX DEBUG NOTE
+syn match     mfComment      "%.*$" contains=mfTodoComment,@Spell
 
 " synchronizing
 syn sync maxlines=50
 
 " Define the default highlighting
-" Only when an item doesn't have highlighting yet
-
-hi def link mfBoolExp	Statement
-hi def link mfNumExp	Statement
-hi def link mfInternal	Identifier
-hi def link mfPairExp	Statement
-hi def link mfPathExp	Statement
-hi def link mfPenExp	Statement
-hi def link mfPicExp	Statement
-hi def link mfStringExp	Statement
-hi def link mfCommand	Statement
-hi def link mfType	Type
-hi def link mfStatement	Statement
-hi def link mfDefinition	Statement
-hi def link mfCondition	Conditional
-hi def link mfPrimitive	Statement
-hi def link mfMacro	Macro
-hi def link mfCoord	Identifier
-hi def link mfPoint	Identifier
-hi def link mfNumeric	Number
-hi def link mfLength	Number
-hi def link mfComment	Comment
-hi def link mfString	String
-
+hi def link mfBoolExp      Statement
+hi def link mfNumExp       Statement
+hi def link mfPairExp      Statement
+hi def link mfPathExp      Statement
+hi def link mfPenExp       Statement
+hi def link mfPicExp       Statement
+hi def link mfStringExp    Statement
+hi def link mfInternal     Identifier
+hi def link mfCommand      Statement
+hi def link mfType         Type
+hi def link mfStatement    Statement
+hi def link mfDefinition   Statement
+hi def link mfCondition    Conditional
+hi def link mfPrimitive    Statement
+hi def link mfDef          Function
+hi def link mfVardef       mfDef
+hi def link mfPrimaryDef   mfDef
+hi def link mfSecondaryDef mfDef
+hi def link mfTertiaryDef  mfDef
+hi def link mfCoord        Identifier
+hi def link mfPoint        Identifier
+hi def link mfNumeric      Number
+hi def link mfLength       Number
+hi def link mfComment      Comment
+hi def link mfString       String
+hi def link mfOpenString   Todo
+hi def link mfSuffixParam  Label
+hi def link mfNewInternal  mfInternal
+hi def link mfVariable     Identifier
+hi def link mfConstant     Constant
+hi def link mfTodoComment  Todo
 
 let b:current_syntax = "mf"
 
-" vim: ts=8
+" vim:sw=2
--- a/runtime/syntax/mp.vim
+++ b/runtime/syntax/mp.vim
@@ -1,115 +1,765 @@
 " Vim syntax file
-" Language:	MetaPost
-" Maintainer:	Andreas Scherer <andreas.scherer@pobox.com>
-" Last Change:	April 30, 2001
+" Language:           MetaPost
+" Maintainer:         Nicola Vitacolonna <nvitacolonna@gmail.com>
+" Former Maintainers: Andreas Scherer <andreas.scherer@pobox.com>
+" Last Change:        2016 Oct 01
 
-" quit when a syntax file was already loaded
 if exists("b:current_syntax")
   finish
 endif
 
-let plain_mf_macros = 0 " plain.mf has no special meaning for MetaPost
-let other_mf_macros = 0 " cmbase.mf, logo.mf, ... neither
+let s:cpo_sav = &cpo
+set cpo&vim
+
+if exists("g:plain_mf_macros")
+  let s:plain_mf_macros = g:plain_mf_macros
+endif
+if exists("g:plain_mf_modes")
+  let s:plain_mf_modes = g:plain_mf_modes
+endif
+if exists("g:other_mf_macros")
+  let s:other_mf_macros = g:other_mf_macros
+endif
+
+let g:plain_mf_macros = 0 " plain.mf has no special meaning for MetaPost
+let g:plain_mf_modes  = 0 " No METAFONT modes
+let g:other_mf_macros = 0 " cmbase.mf, logo.mf, ... neither
 
-" Read the Metafont syntax to start with
+" Read the METAFONT syntax to start with
 runtime! syntax/mf.vim
+unlet b:current_syntax " Necessary for syn include below
+
+" Restore the value of existing global variables
+if exists("s:plain_mf_macros")
+  let g:plain_mf_macros = s:plain_mf_macros
+else
+  unlet g:plain_mf_macros
+endif
+if exists("s:plain_mf_modes")
+  let g:plain_mf_modes = s:plain_mf_modes
+else
+  unlet g:plain_mf_modes
+endif
+if exists("s:other_mf_macros")
+  let g:other_mf_macros = s:other_mf_macros
+else
+  unlet g:other_mf_macros
+endif
 
-" MetaPost has TeX inserts for typeset labels
-" verbatimtex, btex, and etex will be treated as keywords
-syn match mpTeXbegin "\(verbatimtex\|btex\)"
-syn match mpTeXend "etex"
-syn region mpTeXinsert start="\(verbatimtex\|btex\)"hs=e+1 end="etex"he=s-1 contains=mpTeXbegin,mpTeXend keepend
+" Use TeX highlighting inside verbatimtex/btex... etex
+syn include @MPTeX syntax/tex.vim
+unlet b:current_syntax
+" These are defined as keywords rather than using matchgroup
+" in order to make them available to syntaxcomplete.
+syn keyword mpTeXdelim       btex etex verbatimtex contained
+syn region mpTeXinsert
+      \ start=/\<verbatimtex\>\|\<btex\>/rs=e+1
+      \ end=/\<etex\>/re=s-1 keepend
+      \ contains=@MPTeX,mpTeXdelim
+
+" iskeyword must be set after the syn include above, because tex.vim sets `syn
+" iskeyword`. Note that keywords do not contain numbers (numbers are
+" subscripts)
+syntax iskeyword @,_
 
-" MetaPost primitives not found in Metafont
-syn keyword mpInternal bluepart clip color dashed fontsize greenpart infont
-syn keyword mpInternal linecap linejoin llcorner lrcorner miterlimit mpxbreak
-syn keyword mpInternal prologues redpart setbounds tracinglostchars
-syn keyword mpInternal truecorners ulcorner urcorner withcolor
-
-" Metafont primitives not found in MetaPost
-syn keyword notDefined autorounding chardx chardy fillin granularity hppp
-syn keyword notDefined proofing smoothing tracingedges tracingpens
-syn keyword notDefined turningcheck vppp xoffset yoffset
+" MetaPost primitives not found in METAFONT
+syn keyword mpBoolExp        bounded clipped filled stroked textual arclength
+syn keyword mpNumExp         arctime blackpart bluepart colormodel cyanpart
+syn keyword mpNumExp         fontsize greenpart greypart magentapart redpart
+syn keyword mpPairExp        yellowpart llcorner lrcorner ulcorner urcorner
+" envelope is seemingly undocumented, but it exists since mpost 1.003.
+" The syntax is: envelope <polygonal pen> of <path primary>. For example,
+"     path p;
+"     p := envelope pensquare of (up--left);
+" (Thanks to Daniel H. Luecking for the example!)
+syn keyword mpPathExp        envelope pathpart
+syn keyword mpPenExp         penpart
+syn keyword mpPicExp         dashpart glyph infont
+syn keyword mpStringExp      fontpart readfrom textpart
+syn keyword mpType           cmykcolor color rgbcolor
+" Other MetaPost primitives listed in the manual
+syn keyword mpPrimitive      mpxbreak within
+" Internal quantities not found in METAFONT
+" (Table 6 in MetaPost: A User's Manual)
+syn keyword mpInternal       defaultcolormodel hour minute linecap linejoin
+syn keyword mpInternal       miterlimit mpprocset mpversion numberprecision
+syn keyword mpInternal       numbersystem outputfilename outputformat
+syn keyword mpInternal       outputformatoptions outputtemplate prologues
+syn keyword mpInternal       restoreclipcolor tracinglostchars troffmode
+syn keyword mpInternal       truecorners
+" List of commands not found in METAFONT (from MetaPost: A User's Manual)
+syn keyword mpCommand        clip closefrom dashed filenametemplate fontmapfile
+syn keyword mpCommand        fontmapline setbounds withcmykcolor withcolor
+syn keyword mpCommand        withgreyscale withoutcolor withpostscript
+syn keyword mpCommand        withprescript withrgbcolor write
+" METAFONT internal variables not found in MetaPost
+syn keyword notDefined       autorounding chardx chardy fillin granularity
+syn keyword notDefined       proofing smoothing tracingedges tracingpens
+syn keyword notDefined       turningcheck xoffset yoffset
+" Suffix defined only in METAFONT:
+syn keyword notDefined       nodot
+" Other not implemented primitives (see MetaPost: A User's Manual, §C.1)
+syn keyword notDefined       cull display openwindow numspecial totalweight
+syn keyword notDefined       withweight
 
 " Keywords defined by plain.mp
-if !exists("plain_mp_macros")
-  let plain_mp_macros = 1 " Set this to '0' if your source gets too colourful
-endif
-if plain_mp_macros
-  syn keyword mpMacro ahangle ahlength background bbox bboxmargin beginfig
-  syn keyword mpMacro beveled black blue buildcycle butt center cutafter
-  syn keyword mpMacro cutbefore cuttings dashpattern defaultfont defaultpen
-  syn keyword mpMacro defaultscale dotlabel dotlabels drawarrow drawdblarrow
-  syn keyword mpMacro drawoptions endfig evenly extra_beginfig extra_endfig
-  syn keyword mpMacro green label labeloffset mitered red rounded squared
-  syn keyword mpMacro thelabel white base_name base_version
-  syn keyword mpMacro upto downto exitunless relax gobble gobbled
-  syn keyword mpMacro interact loggingall tracingall tracingnone
-  syn keyword mpMacro eps epsilon infinity right left up down origin
-  syn keyword mpMacro quartercircle halfcircle fullcircle unitsquare identity
-  syn keyword mpMacro blankpicture withdots ditto EOF pensquare penrazor
-  syn keyword mpMacro penspeck whatever abs round ceiling byte dir unitvector
-  syn keyword mpMacro inverse counterclockwise tensepath mod div dotprod
-  syn keyword mpMacro takepower direction directionpoint intersectionpoint
-  syn keyword mpMacro softjoin incr decr reflectedabout rotatedaround
-  syn keyword mpMacro rotatedabout min max flex superellipse interpath
-  syn keyword mpMacro magstep currentpen currentpen_path currentpicture
-  syn keyword mpMacro fill draw filldraw drawdot unfill undraw unfilldraw
-  syn keyword mpMacro undrawdot erase cutdraw image pickup numeric_pickup
-  syn keyword mpMacro pen_lft pen_rt pen_top pen_bot savepen clearpen
-  syn keyword mpMacro clear_pen_memory lft rt top bot ulft urt llft lrt
-  syn keyword mpMacro penpos penstroke arrowhead makelabel labels penlabel
-  syn keyword mpMacro range numtok thru clearxy clearit clearpen pickup
-  syn keyword mpMacro shipit bye hide stop solve
+if get(g:, "plain_mp_macros", 1) || get(g:, "mp_metafun_macros", 0)
+  syn keyword mpDef          beginfig clear_pen_memory clearit clearpen clearpen
+  syn keyword mpDef          clearxy colorpart cutdraw downto draw drawarrow
+  syn keyword mpDef          drawdblarrow drawdot drawoptions endfig erase
+  syn keyword mpDef          exitunless fill filldraw flex gobble hide interact
+  syn keyword mpDef          label loggingall makelabel numtok penstroke pickup
+  syn keyword mpDef          range reflectedabout rotatedaround shipit
+  syn keyword mpDef          stop superellipse takepower tracingall tracingnone
+  syn keyword mpDef          undraw undrawdot unfill unfilldraw upto
+  syn match   mpDef          "???"
+  syn keyword mpVardef       arrowhead bbox bot buildcycle byte ceiling center
+  syn keyword mpVardef       counterclockwise decr dir direction directionpoint
+  syn keyword mpVardef       dotlabel dotlabels image incr interpath inverse
+  syn keyword mpVardef       labels lft magstep max min penlabels penpos round
+  syn keyword mpVardef       rt savepen solve tensepath thelabel top unitvector
+  syn keyword mpVardef       whatever z
+  syn keyword mpPrimaryDef   div dotprod gobbled mod
+  syn keyword mpSecondaryDef intersectionpoint
+  syn keyword mpTertiaryDef  cutafter cutbefore softjoin thru
+  syn keyword mpNewInternal  ahangle ahlength bboxmargin beveled butt defaultpen
+  syn keyword mpNewInternal  defaultscale dotlabeldiam eps epsilon infinity
+  syn keyword mpNewInternal  join_radius labeloffset mitered pen_bot pen_lft
+  syn keyword mpNewInternal  pen_rt pen_top rounded squared tolerance
+  " Predefined constants
+  syn keyword mpConstant     EOF background base_name base_version black
+  syn keyword mpConstant     blankpicture blue ditto down evenly fullcircle
+  syn keyword mpConstant     green halfcircle identity left origin penrazor
+  syn keyword mpConstant     penspeck pensquare quartercircle red right
+  syn keyword mpConstant     unitsquare up white withdots
+  " Other predefined variables
+  syn keyword mpVariable     currentpen currentpen_path currentpicture cuttings
+  syn keyword mpVariable     defaultfont extra_beginfig extra_endfig
+  syn match   mpVariable     /\<\%(laboff\|labxf\|labyf\)\>/
+  syn match   mpVariable     /\<\%(laboff\|labxf\|labyf\)\.\%(lft\|rt\|bot\|top\|ulft\|urt\|llft\|lrt\)\>/
+  " let statements:
+  syn keyword mpnumExp       abs
+  syn keyword mpDef          rotatedabout
+  syn keyword mpCommand      bye relax
+  " on and off are not technically keywords, but it is nice to highlight them
+  " inside dashpattern().
+  syn keyword mpOnOff        off on contained
+  syn keyword mpDash         dashpattern contained
+  syn region  mpDashPattern
+        \ start="dashpattern\s*"
+        \ end=")"he=e-1
+        \ contains=mfNumeric,mfLength,mpOnOff,mpDash
 endif
 
 " Keywords defined by mfplain.mp
-if !exists("mfplain_mp_macros")
-  let mfplain_mp_macros = 0 " Set this to '1' to include these macro names
+if get(g:, "mfplain_mp_macros", 0)
+  syn keyword mpDef          beginchar capsule_def change_width
+  syn keyword mpDef          define_blacker_pixels define_corrected_pixels
+  syn keyword mpDef          define_good_x_pixels define_good_y_pixels
+  syn keyword mpDef          define_horizontal_corrected_pixels define_pixels
+  syn keyword mpDef          define_whole_blacker_pixels define_whole_pixels
+  syn keyword mpDef          define_whole_vertical_blacker_pixels
+  syn keyword mpDef          define_whole_vertical_pixels endchar
+  syn keyword mpDef          font_coding_scheme font_extra_space font_identifier
+  syn keyword mpDef          font_normal_shrink font_normal_space
+  syn keyword mpDef          font_normal_stretch font_quad font_size font_slant
+  syn keyword mpDef          font_x_height italcorr labelfont lowres_fix makebox
+  syn keyword mpDef          makegrid maketicks mode_def mode_setup proofrule
+  syn keyword mpDef          smode
+  syn keyword mpVardef       hround proofrulethickness vround
+  syn keyword mpNewInternal  blacker o_correction
+  syn keyword mpVariable     extra_beginchar extra_endchar extra_setup rulepen
+  " plus some no-ops, also from mfplain.mp
+  syn keyword mpDef          cull cullit gfcorners imagerules nodisplays
+  syn keyword mpDef          notransforms openit proofoffset screenchars
+  syn keyword mpDef          screenrule screenstrokes showit
+  syn keyword mpVardef       grayfont slantfont titlefont
+  syn keyword mpVariable     currenttransform
+  syn keyword mpConstant     unitpixel
+  " These are not listed in the MetaPost manual, and some are ignored by
+  " MetaPost, but are nonetheless defined in mfplain.mp
+  syn keyword mpDef          killtext
+  syn match   mpVardef       "\<good\.\%(x\|y\|lft\|rt\|top\|bot\)\>"
+  syn keyword mpVariable     aspect_ratio localfont mag mode mode_name
+  syn keyword mpVariable     proofcolor
+  syn keyword mpConstant     lowres proof smoke
+  syn keyword mpNewInternal  autorounding bp_per_pixel granularity
+  syn keyword mpNewInternal  number_of_modes proofing smoothing turningcheck
 endif
-if mfplain_mp_macros
-  syn keyword mpMacro beginchar blacker capsule_def change_width
-  syn keyword mpMacro define_blacker_pixels define_corrected_pixels
-  syn keyword mpMacro define_good_x_pixels define_good_y_pixels
-  syn keyword mpMacro define_horizontal_corrected_pixels
-  syn keyword mpMacro define_pixels define_whole_blacker_pixels
-  syn keyword mpMacro define_whole_vertical_blacker_pixels
-  syn keyword mpMacro define_whole_vertical_pixels endchar
-  syn keyword mpMacro extra_beginchar extra_endchar extra_setup
-  syn keyword mpMacro font_coding_scheme font_extra_space font_identifier
-  syn keyword mpMacro font_normal_shrink font_normal_space
-  syn keyword mpMacro font_normal_stretch font_quad font_size
-  syn keyword mpMacro font_slant font_x_height italcorr labelfont
-  syn keyword mpMacro makebox makegrid maketicks mode_def mode_setup
-  syn keyword mpMacro o_correction proofrule proofrulethickness rulepen smode
 
-  " plus some no-ops, also from mfplain.mp
-  syn keyword mpMacro cullit currenttransform gfcorners grayfont hround
-  syn keyword mpMacro imagerules lowres_fix nodisplays notransforms openit
-  syn keyword mpMacro proofoffset screenchars screenrule screenstrokes
-  syn keyword mpMacro showit slantfont titlefont unitpixel vround
+" Keywords defined by all base macro packages:
+" - (r)boxes.mp
+" - format.mp
+" - graph.mp
+" - marith.mp
+" - sarith.mp
+" - string.mp
+" - TEX.mp
+if get(g:, "other_mp_macros", 1)
+  " boxes and rboxes
+  syn keyword mpDef          boxjoin drawboxed drawboxes drawunboxed
+  syn keyword mpNewInternal  circmargin defaultdx defaultdy rbox_radius
+  syn keyword mpVardef       boxit bpath circleit fixpos fixsize generic_declare
+  syn keyword mpVardef       generic_redeclare generisize pic rboxit str_prefix
+  " format
+  syn keyword mpVardef       Mformat format init_numbers roundd
+  syn keyword mpVariable     Fe_base Fe_plus
+  syn keyword mpConstant     Ten_to
+  " graph
+  syn keyword mpDef          Gfor Gxyscale OUT auto begingraph endgraph gdata
+  syn keyword mpDef          gdraw gdrawarrow gdrawdblarrow gfill plot
+  syn keyword mpVardef       augment autogrid frame gdotlabel glabel grid itick
+  syn keyword mpVardef       otick
+  syn keyword mpVardef       Mreadpath setcoords setrange
+  syn keyword mpNewInternal  Gmarks Gminlog Gpaths linear log
+  syn keyword mpVariable     Autoform Gemarks Glmarks Gumarks
+  syn keyword mpConstant     Gtemplate
+  syn match   mpVariable     /Gmargin\.\%(low\|high\)/
+  " marith
+  syn keyword mpVardef       Mabs Meform Mexp Mexp_str Mlog Mlog_Str Mlog_str
+  syn keyword mpPrimaryDef   Mdiv Mmul
+  syn keyword mpSecondaryDef Madd Msub
+  syn keyword mpTertiaryDef  Mleq
+  syn keyword mpNewInternal  Mten Mzero
+  " sarith
+  syn keyword mpVardef       Sabs Scvnum
+  syn keyword mpPrimaryDef   Sdiv Smul
+  syn keyword mpSecondaryDef Sadd Ssub
+  syn keyword mpTertiaryDef  Sleq Sneq
+  " string
+  syn keyword mpVardef       cspan isdigit loptok
+  " TEX
+  syn keyword mpVardef       TEX TEXPOST TEXPRE
 endif
 
-" Keywords defined by other macro packages, e.g., boxes.mp
-if !exists("other_mp_macros")
-  let other_mp_macros = 1 " Set this to '0' if your source gets too colourful
-endif
-if other_mp_macros
-  syn keyword mpMacro circmargin defaultdx defaultdy
-  syn keyword mpMacro boxit boxjoin bpath circleit drawboxed drawboxes
-  syn keyword mpMacro drawunboxed fixpos fixsize pic
-endif
+" Up to date as of 23-Sep-2016.
+if get(g:, "mp_metafun_macros", 0)
+  " These keywords have been added manually.
+  syn keyword mpPrimitive runscript
+
+  " The following MetaFun keywords have been extracted automatically from
+  " ConTeXt source code. They include all "public" macros (where a macro is
+  " considered public if and only if it does not start with _, mfun_, mlib_, or
+  " do_, and it does not end with _), all "public" unsaved variables, and all
+  " `let` statements.
+
+  " mp-abck.mpiv
+  syn keyword mpDef          abck_grid_line anchor_box box_found boxfilloptions
+  syn keyword mpDef          boxgridoptions boxlineoptions draw_multi_pars
+  syn keyword mpDef          draw_multi_side draw_multi_side_path freeze_box
+  syn keyword mpDef          initialize_box initialize_box_pos
+  syn keyword mpDef          multi_side_draw_options show_multi_kind
+  syn keyword mpDef          show_multi_pars
+  syn keyword mpVardef       abck_baseline_grid abck_draw_path abck_graphic_grid
+  syn keyword mpVariable     boxdashtype boxfilloffset boxfilltype
+  syn keyword mpVariable     boxgriddirection boxgriddistance boxgridshift
+  syn keyword mpVariable     boxgridtype boxgridwidth boxlineoffset
+  syn keyword mpVariable     boxlineradius boxlinetype boxlinewidth multikind
+  syn keyword mpConstant     context_abck
+  " mp-apos.mpiv
+  syn keyword mpDef          anch_sidebars_draw boxfilloptions boxlineoptions
+  syn keyword mpDef          connect_positions
+  syn keyword mpConstant     context_apos
+  " mp-asnc.mpiv
+  syn keyword mpDef          FlushSyncTasks ProcessSyncTask ResetSyncTasks
+  syn keyword mpDef          SetSyncColor SetSyncThreshold SyncTask
+  syn keyword mpVardef       PrepareSyncTasks SyncBox TheSyncColor
+  syn keyword mpVardef       TheSyncThreshold
+  syn keyword mpVariable     CurrentSyncClass NOfSyncPaths SyncColor
+  syn keyword mpVariable     SyncLeftOffset SyncPaths SyncTasks SyncThreshold
+  syn keyword mpVariable     SyncThresholdMethod SyncWidth
+  syn keyword mpConstant     context_asnc
+  " mp-back.mpiv
+  syn keyword mpDef          some_double_back some_hash
+  syn keyword mpVariable     back_nillcolor
+  syn keyword mpConstant     context_back
+  " mp-bare.mpiv
+  syn keyword mpVardef       colordecimals rawtextext
+  syn keyword mpPrimaryDef   infont
+  syn keyword mpConstant     context_bare
+  " mp-base.mpiv
+  " This is essentially plain.mp with only a few keywords added
+  syn keyword mpNumExp       graypart
+  syn keyword mpType         graycolor greycolor
+  syn keyword mpConstant     cyan magenta yellow
+  " mp-butt.mpiv
+  syn keyword mpDef          predefinedbutton some_button
+  syn keyword mpConstant     context_butt
+  " mp-char.mpiv
+  syn keyword mpDef          flow_begin_chart flow_begin_sub_chart
+  syn keyword mpDef          flow_chart_draw_comment flow_chart_draw_exit
+  syn keyword mpDef          flow_chart_draw_label flow_chart_draw_text
+  syn keyword mpDef          flow_clip_chart flow_collapse_points
+  syn keyword mpDef          flow_connect_bottom_bottom flow_connect_bottom_left
+  syn keyword mpDef          flow_connect_bottom_right flow_connect_bottom_top
+  syn keyword mpDef          flow_connect_left_bottom flow_connect_left_left
+  syn keyword mpDef          flow_connect_left_right flow_connect_left_top
+  syn keyword mpDef          flow_connect_right_bottom flow_connect_right_left
+  syn keyword mpDef          flow_connect_right_right flow_connect_right_top
+  syn keyword mpDef          flow_connect_top_bottom flow_connect_top_left
+  syn keyword mpDef          flow_connect_top_right flow_connect_top_top
+  syn keyword mpDef          flow_draw_connection flow_draw_connection_point
+  syn keyword mpDef          flow_draw_midpoint flow_draw_shape
+  syn keyword mpDef          flow_draw_test_area flow_draw_test_shape
+  syn keyword mpDef          flow_draw_test_shapes flow_end_chart
+  syn keyword mpDef          flow_end_sub_chart flow_flush_connections
+  syn keyword mpDef          flow_flush_picture flow_flush_pictures
+  syn keyword mpDef          flow_flush_shape flow_flush_shapes
+  syn keyword mpDef          flow_initialize_grid flow_new_chart flow_new_shape
+  syn keyword mpDef          flow_scaled_to_grid flow_show_connection
+  syn keyword mpDef          flow_show_connections flow_show_shapes
+  syn keyword mpDef          flow_xy_offset flow_y_pos
+  syn keyword mpVardef       flow_connection_path flow_down_on_grid
+  syn keyword mpVardef       flow_down_to_grid flow_i_point flow_left_on_grid
+  syn keyword mpVardef       flow_left_to_grid flow_offset
+  syn keyword mpVardef       flow_points_initialized flow_right_on_grid
+  syn keyword mpVardef       flow_right_to_grid flow_smooth_connection
+  syn keyword mpVardef       flow_trim_points flow_trimmed flow_up_on_grid
+  syn keyword mpVardef       flow_up_to_grid flow_valid_connection
+  syn keyword mpVardef       flow_x_on_grid flow_xy_bottom flow_xy_left
+  syn keyword mpVardef       flow_xy_on_grid flow_xy_right flow_xy_top
+  syn keyword mpVardef       flow_y_on_grid
+  syn keyword mpVariable     flow_arrowtip flow_chart_background_color
+  syn keyword mpVariable     flow_chart_offset flow_comment_offset
+  syn keyword mpVariable     flow_connection_arrow_size
+  syn keyword mpVariable     flow_connection_dash_size
+  syn keyword mpVariable     flow_connection_line_color
+  syn keyword mpVariable     flow_connection_line_width
+  syn keyword mpVariable     flow_connection_smooth_size flow_connections
+  syn keyword mpVariable     flow_cpath flow_dash_pattern flow_dashline
+  syn keyword mpVariable     flow_exit_offset flow_forcevalid flow_grid_height
+  syn keyword mpVariable     flow_grid_width flow_label_offset flow_max_x
+  syn keyword mpVariable     flow_max_y flow_peepshape flow_reverse_connection
+  syn keyword mpVariable     flow_reverse_y flow_shape_action flow_shape_archive
+  syn keyword mpVariable     flow_shape_decision flow_shape_down
+  syn keyword mpVariable     flow_shape_fill_color flow_shape_height
+  syn keyword mpVariable     flow_shape_left flow_shape_line_color
+  syn keyword mpVariable     flow_shape_line_width flow_shape_loop
+  syn keyword mpVariable     flow_shape_multidocument flow_shape_node
+  syn keyword mpVariable     flow_shape_procedure flow_shape_product
+  syn keyword mpVariable     flow_shape_right flow_shape_singledocument
+  syn keyword mpVariable     flow_shape_subprocedure flow_shape_up
+  syn keyword mpVariable     flow_shape_wait flow_shape_width
+  syn keyword mpVariable     flow_show_all_points flow_show_con_points
+  syn keyword mpVariable     flow_show_mid_points flow_showcrossing flow_smooth
+  syn keyword mpVariable     flow_touchshape flow_xypoint flow_zfactor
+  syn keyword mpConstant     context_flow
+  " mp-chem.mpiv
+  syn keyword mpDef          chem_init_all chem_reset chem_start_structure
+  syn keyword mpDef          chem_transformed
+  syn keyword mpVardef       chem_ad chem_adj chem_align chem_arrow chem_au
+  syn keyword mpVardef       chem_b chem_bb chem_bd chem_bw chem_c chem_cc
+  syn keyword mpVardef       chem_ccd chem_cd chem_crz chem_cz chem_dash chem_db
+  syn keyword mpVardef       chem_diff chem_dir chem_do chem_dr chem_draw
+  syn keyword mpVardef       chem_drawarrow chem_eb chem_ed chem_ep chem_er
+  syn keyword mpVardef       chem_es chem_et chem_fill chem_hb chem_init_some
+  syn keyword mpVardef       chem_label chem_ldb chem_ldd chem_line chem_lr
+  syn keyword mpVardef       chem_lrb chem_lrbd chem_lrd chem_lrh chem_lrn
+  syn keyword mpVardef       chem_lrt chem_lrz chem_lsr chem_lsub chem_mark
+  syn keyword mpVardef       chem_marked chem_mid chem_mids chem_midz chem_mir
+  syn keyword mpVardef       chem_mov chem_move chem_number chem_oe chem_off
+  syn keyword mpVardef       chem_pb chem_pe chem_r chem_r_fragment chem_rb
+  syn keyword mpVardef       chem_rbd chem_rd chem_rdb chem_rdd chem_restore
+  syn keyword mpVardef       chem_rh chem_rm chem_rn chem_rot chem_rr chem_rrb
+  syn keyword mpVardef       chem_rrbd chem_rrd chem_rrh chem_rrn chem_rrt
+  syn keyword mpVardef       chem_rrz chem_rsr chem_rsub chem_rt chem_rz chem_s
+  syn keyword mpVardef       chem_save chem_sb chem_sd chem_set chem_sr chem_ss
+  syn keyword mpVardef       chem_start_component chem_stop_component
+  syn keyword mpVardef       chem_stop_structure chem_sub chem_symbol chem_tb
+  syn keyword mpVardef       chem_text chem_z chem_zln chem_zlt chem_zn chem_zrn
+  syn keyword mpVardef       chem_zrt chem_zt
+  syn keyword mpVariable     chem_mark_pair chem_stack_mirror chem_stack_origin
+  syn keyword mpVariable     chem_stack_p chem_stack_previous
+  syn keyword mpVariable     chem_stack_rotation chem_trace_boundingbox
+  syn keyword mpVariable     chem_trace_nesting chem_trace_text
+  syn keyword mpConstant     context_chem
+  " mp-core.mpiv
+  syn keyword mpDef          FlushSyncTasks ProcessSyncTask
+  syn keyword mpDef          RegisterLocalTextArea RegisterPlainTextArea
+  syn keyword mpDef          RegisterRegionTextArea RegisterTextArea
+  syn keyword mpDef          ResetLocalTextArea ResetSyncTasks ResetTextAreas
+  syn keyword mpDef          SaveTextAreas SetSyncColor SetSyncThreshold
+  syn keyword mpDef          SyncTask anchor_box box_found boxfilloptions
+  syn keyword mpDef          boxgridoptions boxlineoptions collapse_multi_pars
+  syn keyword mpDef          draw_box draw_multi_pars draw_par freeze_box
+  syn keyword mpDef          initialize_area initialize_area_par initialize_box
+  syn keyword mpDef          initialize_box_pos initialize_par
+  syn keyword mpDef          prepare_multi_pars relocate_multipars save_multipar
+  syn keyword mpDef          set_par_line_height show_multi_pars show_par
+  syn keyword mpDef          simplify_multi_pars sort_multi_pars
+  syn keyword mpVardef       InsideSavedTextArea InsideSomeSavedTextArea
+  syn keyword mpVardef       InsideSomeTextArea InsideTextArea PrepareSyncTasks
+  syn keyword mpVardef       SyncBox TextAreaH TextAreaW TextAreaWH TextAreaX
+  syn keyword mpVardef       TextAreaXY TextAreaY TheSyncColor TheSyncThreshold
+  syn keyword mpVardef       baseline_grid graphic_grid multi_par_at_top
+  syn keyword mpVariable     CurrentSyncClass NOfSavedTextAreas
+  syn keyword mpVariable     NOfSavedTextColumns NOfSyncPaths NOfTextAreas
+  syn keyword mpVariable     NOfTextColumns PlainTextArea RegionTextArea
+  syn keyword mpVariable     SavedTextColumns SyncColor SyncLeftOffset SyncPaths
+  syn keyword mpVariable     SyncTasks SyncThreshold SyncThresholdMethod
+  syn keyword mpVariable     SyncWidth TextAreas TextColumns
+  syn keyword mpVariable     auto_multi_par_hsize boxdashtype boxfilloffset
+  syn keyword mpVariable     boxfilltype boxgriddirection boxgriddistance
+  syn keyword mpVariable     boxgridshift boxgridtype boxgridwidth boxlineradius
+  syn keyword mpVariable     boxlinetype boxlinewidth check_multi_par_chain
+  syn keyword mpVariable     compensate_multi_par_topskip
+  syn keyword mpVariable     enable_multi_par_fallback force_multi_par_chain
+  syn keyword mpVariable     ignore_multi_par_page last_multi_par_shift lefthang
+  syn keyword mpVariable     local_multi_par_area multi_column_first_page_hack
+  syn keyword mpVariable     multi_par_pages multiloc multilocs multipar
+  syn keyword mpVariable     multipars multiref multirefs nofmultipars
+  syn keyword mpVariable     obey_multi_par_hang obey_multi_par_more
+  syn keyword mpVariable     one_piece_multi_par par_hang_after par_hang_indent
+  syn keyword mpVariable     par_indent par_left_skip par_line_height
+  syn keyword mpVariable     par_right_skip par_start_pos par_stop_pos
+  syn keyword mpVariable     par_strut_depth par_strut_height ppos righthang
+  syn keyword mpVariable     snap_multi_par_tops somehang span_multi_column_pars
+  syn keyword mpVariable     use_multi_par_region
+  syn keyword mpConstant     context_core
+  syn keyword LET            anchor_area anchor_par draw_area
+  " mp-cows.mpiv
+  syn keyword mpConstant     context_cows cow
+  " mp-crop.mpiv
+  syn keyword mpDef          page_marks_add_color page_marks_add_lines
+  syn keyword mpDef          page_marks_add_marking page_marks_add_number
+  syn keyword mpVardef       crop_color crop_gray crop_marks_cmyk
+  syn keyword mpVardef       crop_marks_cmykrgb crop_marks_gray crop_marks_lines
+  syn keyword mpVariable     crop_colors more page
+  syn keyword mpConstant     context_crop
+  " mp-figs.mpiv
+  syn keyword mpDef          naturalfigure registerfigure
+  syn keyword mpVardef       figuredimensions figureheight figuresize
+  syn keyword mpVardef       figurewidth
+  syn keyword mpConstant     context_figs
+  " mp-fobg.mpiv
+  syn keyword mpDef          DrawFoFrame
+  syn keyword mpVardef       equalpaths
+  syn keyword mpPrimaryDef   inset outset
+  syn keyword mpVariable     FoBackground FoBackgroundColor FoFrame FoLineColor
+  syn keyword mpVariable     FoLineStyle FoLineWidth FoSplit
+  syn keyword mpConstant     FoAll FoBottom FoDash FoDotted FoDouble FoGroove
+  syn keyword mpConstant     FoHidden FoInset FoLeft FoMedium FoNoColor FoNone
+  syn keyword mpConstant     FoOutset FoRidge FoRight FoSolid FoThick FoThin
+  syn keyword mpConstant     FoTop context_fobg
+  " mp-form.mpiv
+  syn keyword mpConstant     context_form
+  " mp-func.mpiv
+  syn keyword mpDef          constructedfunction constructedpairs
+  syn keyword mpDef          constructedpath curvedfunction curvedpairs
+  syn keyword mpDef          curvedpath function pathconnectors straightfunction
+  syn keyword mpDef          straightpairs straightpath
+  syn keyword mpConstant     context_func
+  " mp-grap.mpiv
+  syn keyword mpDef          Gfor OUT auto begingraph circles crosses diamonds
+  syn keyword mpDef          downtriangles endgraph gdata gdraw gdrawarrow
+  syn keyword mpDef          gdrawdblarrow gfill graph_addto
+  syn keyword mpDef          graph_addto_currentpicture graph_comma
+  syn keyword mpDef          graph_coordinate_multiplication graph_draw
+  syn keyword mpDef          graph_draw_label graph_errorbar_text graph_fill
+  syn keyword mpDef          graph_generate_exponents
+  syn keyword mpDef          graph_generate_label_position
+  syn keyword mpDef          graph_generate_numbers graph_label_location
+  syn keyword mpDef          graph_scan_mark graph_scan_marks graph_setbounds
+  syn keyword mpDef          graph_suffix graph_tick_label
+  syn keyword mpDef          graph_with_pen_and_color graph_withlist
+  syn keyword mpDef          graph_xyscale lefttriangles makefunctionpath plot
+  syn keyword mpDef          plotsymbol points rainbow righttriangles smoothpath
+  syn keyword mpDef          squares stars uptriangles witherrorbars
+  syn keyword mpVardef       addtopath augment autogrid constant_fit
+  syn keyword mpVardef       constant_function det escaped_format exp
+  syn keyword mpVardef       exponential_fit exponential_function format
+  syn keyword mpVardef       formatted frame functionpath gaussian_fit
+  syn keyword mpVardef       gaussian_function gdotlabel glabel graph_Feform
+  syn keyword mpVardef       graph_Meform graph_arrowhead_extent graph_bounds
+  syn keyword mpVardef       graph_clear_bounds
+  syn keyword mpVardef       graph_convert_user_path_to_internal graph_cspan
+  syn keyword mpVardef       graph_draw_arrowhead graph_error graph_errorbars
+  syn keyword mpVardef       graph_exp graph_factor_and_exponent_to_string
+  syn keyword mpVardef       graph_gridline_picture graph_is_null
+  syn keyword mpVardef       graph_label_convert_user_to_internal graph_loptok
+  syn keyword mpVardef       graph_match_exponents graph_mlog
+  syn keyword mpVardef       graph_modified_exponent_ypart graph_pair_adjust
+  syn keyword mpVardef       graph_picture_conversion graph_post_draw
+  syn keyword mpVardef       graph_read_line graph_readpath graph_remap
+  syn keyword mpVardef       graph_scan_path graph_select_exponent_mark
+  syn keyword mpVardef       graph_select_mark graph_set_bounds
+  syn keyword mpVardef       graph_set_default_bounds graph_shapesize
+  syn keyword mpVardef       graph_stash_label graph_tick_mark_spacing
+  syn keyword mpVardef       graph_unknown_pair_bbox grid isdigit itick
+  syn keyword mpVardef       linear_fit linear_function ln logten lorentzian_fit
+  syn keyword mpVardef       lorentzian_function otick polynomial_fit
+  syn keyword mpVardef       polynomial_function power_law_fit
+  syn keyword mpVardef       power_law_function powten setcoords setrange
+  syn keyword mpVardef       sortpath strfmt tick varfmt
+  syn keyword mpNewInternal  Mzero doubleinfinity graph_log_minimum
+  syn keyword mpNewInternal  graph_minimum_number_of_marks largestmantissa
+  syn keyword mpNewInternal  linear lntwo log mlogten singleinfinity
+  syn keyword mpVariable     Autoform determinant fit_chi_squared
+  syn keyword mpVariable     graph_errorbar_picture graph_exp_marks
+  syn keyword mpVariable     graph_frame_pair_a graph_frame_pair_b
+  syn keyword mpVariable     graph_lin_marks graph_log_marks graph_modified_bias
+  syn keyword mpVariable     graph_modified_higher graph_modified_lower
+  syn keyword mpVariable     graph_shape r_s resistance_color resistance_name
+  syn keyword mpConstant     context_grap
+  " mp-grid.mpiv
+  syn keyword mpDef          hlingrid hloggrid vlingrid vloggrid
+  syn keyword mpVardef       hlinlabel hlintext hlogtext linlin linlinpath
+  syn keyword mpVardef       linlog linlogpath loglin loglinpath loglog
+  syn keyword mpVardef       loglogpath processpath vlinlabel vlintext vlogtext
+  syn keyword mpVariable     fmt_initialize fmt_pictures fmt_precision
+  syn keyword mpVariable     fmt_separator fmt_zerocheck grid_eps
+  syn keyword mpConstant     context_grid
+  " mp-grph.mpiv
+  syn keyword mpDef          beginfig begingraphictextfig data_mpo_file
+  syn keyword mpDef          data_mpy_file doloadfigure draw endfig
+  syn keyword mpDef          endgraphictextfig fill fixedplace graphictext
+  syn keyword mpDef          loadfigure new_graphictext normalwithshade number
+  syn keyword mpDef          old_graphictext outlinefill protectgraphicmacros
+  syn keyword mpDef          resetfig reversefill withdrawcolor withfillcolor
+  syn keyword mpDef          withshade
+  syn keyword mpVariable     currentgraphictext figureshift
+  syn keyword mpConstant     context_grph
+  " mp-idea.mpiv
+  syn keyword mpVardef       bcomponent ccomponent gcomponent mcomponent
+  syn keyword mpVardef       rcomponent somecolor ycomponent
+  " mp-luas.mpiv
+  syn keyword mpDef          luacall message
+  syn keyword mpVardef       MP lua lualist
+  syn keyword mpConstant     context_luas
+  " mp-mlib.mpiv
+  syn keyword mpDef          autoalign bitmapimage circular_shade cmyk comment
+  syn keyword mpDef          defineshade eofill eofillup externalfigure figure
+  syn keyword mpDef          fillup label linear_shade multitonecolor namedcolor
+  syn keyword mpDef          nofill onlayer passarrayvariable passvariable
+  syn keyword mpDef          plain_label register resolvedcolor scantokens
+  syn keyword mpDef          set_circular_vector set_linear_vector shaded
+  syn keyword mpDef          spotcolor startpassingvariable stoppassingvariable
+  syn keyword mpDef          thelabel transparent[] usemetafunlabels
+  syn keyword mpDef          useplainlabels withcircularshade withlinearshade
+  syn keyword mpDef          withmask withproperties withshadecenter
+  syn keyword mpDef          withshadecolors withshadedirection withshadedomain
+  syn keyword mpDef          withshadefactor withshadefraction withshadeorigin
+  syn keyword mpDef          withshaderadius withshadestep withshadetransform
+  syn keyword mpDef          withshadevector withtransparency
+  syn keyword mpVardef       anchored checkbounds checkedbounds
+  syn keyword mpVardef       define_circular_shade define_linear_shade dotlabel
+  syn keyword mpVardef       escaped_format fmttext fontsize format formatted
+  syn keyword mpVardef       installlabel onetimefmttext onetimetextext
+  syn keyword mpVardef       outlinetext plain_thelabel properties rawfmttext
+  syn keyword mpVardef       rawtexbox rawtextext rule strfmt strut texbox
+  syn keyword mpVardef       textext thefmttext thelabel thetexbox thetextext
+  syn keyword mpVardef       tostring transparency_alternative_to_number
+  syn keyword mpVardef       validtexbox varfmt verbatim
+  syn keyword mpPrimaryDef   asgroup infont normalinfont shadedinto
+  syn keyword mpPrimaryDef   shownshadecenter shownshadedirection
+  syn keyword mpPrimaryDef   shownshadeorigin shownshadevector withshade
+  syn keyword mpPrimaryDef   withshademethod
+  syn keyword mpNewInternal  colorburntransparent colordodgetransparent
+  syn keyword mpNewInternal  colortransparent darkentransparent
+  syn keyword mpNewInternal  differencetransparent exclusiontransparent
+  syn keyword mpNewInternal  hardlighttransparent huetransparent
+  syn keyword mpNewInternal  lightentransparent luminositytransparent
+  syn keyword mpNewInternal  multiplytransparent normaltransparent
+  syn keyword mpNewInternal  overlaytransparent saturationtransparent
+  syn keyword mpNewInternal  screentransparent shadefactor softlighttransparent
+  syn keyword mpNewInternal  textextoffset
+  syn keyword mpType         property transparency
+  syn keyword mpVariable     currentoutlinetext shadeddown shadedleft
+  syn keyword mpVariable     shadedright shadedup shadeoffset trace_shades
+  syn keyword mpConstant     context_mlib
+  " mp-page.mpiv
+  syn keyword mpDef          BoundCoverAreas BoundPageAreas Enlarged FakeRule
+  syn keyword mpDef          FakeWord LoadPageState OverlayBox RuleColor
+  syn keyword mpDef          SetAreaVariables SetPageArea SetPageBackPage
+  syn keyword mpDef          SetPageCoverPage SetPageField SetPageFrontPage
+  syn keyword mpDef          SetPageHsize SetPageHstep SetPageLocation
+  syn keyword mpDef          SetPagePage SetPageSpine SetPageVariables
+  syn keyword mpDef          SetPageVsize SetPageVstep StartCover StartPage
+  syn keyword mpDef          StopCover StopPage SwapPageState innerenlarged
+  syn keyword mpDef          llEnlarged lrEnlarged outerenlarged ulEnlarged
+  syn keyword mpDef          urEnlarged
+  syn keyword mpVardef       BackPageHeight BackPageWidth BackSpace BaseLineSkip
+  syn keyword mpVardef       BodyFontSize BottomDistance BottomHeight
+  syn keyword mpVardef       BottomSpace CoverHeight CoverWidth CurrentColumn
+  syn keyword mpVardef       CurrentHeight CurrentWidth CutSpace EmWidth
+  syn keyword mpVardef       ExHeight FooterDistance FooterHeight
+  syn keyword mpVardef       FrontPageHeight FrontPageWidth HSize HeaderDistance
+  syn keyword mpVardef       HeaderHeight InPageBody InnerEdgeDistance
+  syn keyword mpVardef       InnerEdgeWidth InnerMarginDistance InnerMarginWidth
+  syn keyword mpVardef       InnerSpaceWidth LastPageNumber LayoutColumnDistance
+  syn keyword mpVardef       LayoutColumnWidth LayoutColumns LeftEdgeDistance
+  syn keyword mpVardef       LeftEdgeWidth LeftMarginDistance LeftMarginWidth
+  syn keyword mpVardef       LineHeight MakeupHeight MakeupWidth NOfColumns
+  syn keyword mpVardef       NOfPages OnOddPage OnRightPage OuterEdgeDistance
+  syn keyword mpVardef       OuterEdgeWidth OuterMarginDistance OuterMarginWidth
+  syn keyword mpVardef       OuterSpaceWidth OverlayDepth OverlayHeight
+  syn keyword mpVardef       OverlayLineWidth OverlayOffset OverlayWidth
+  syn keyword mpVardef       PageDepth PageFraction PageNumber PageOffset
+  syn keyword mpVardef       PaperBleed PaperHeight PaperWidth PrintPaperHeight
+  syn keyword mpVardef       PrintPaperWidth RealPageNumber RightEdgeDistance
+  syn keyword mpVardef       RightEdgeWidth RightMarginDistance RightMarginWidth
+  syn keyword mpVardef       SpineHeight SpineWidth StrutDepth StrutHeight
+  syn keyword mpVardef       TextHeight TextWidth TopDistance TopHeight TopSkip
+  syn keyword mpVardef       TopSpace VSize defaultcolormodel
+  syn keyword mpVariable     Area BackPage CoverPage CurrentLayout Field
+  syn keyword mpVariable     FrontPage HorPos Hsize Hstep Location Page
+  syn keyword mpVariable     PageStateAvailable RuleDepth RuleDirection
+  syn keyword mpVariable     RuleFactor RuleH RuleHeight RuleOffset RuleOption
+  syn keyword mpVariable     RuleThickness RuleV RuleWidth Spine VerPos Vsize
+  syn keyword mpVariable     Vstep
+  syn keyword mpConstant     context_page
+  " mp-shap.mpiv
+  syn keyword mpDef          drawline drawshape some_shape
+  syn keyword mpDef          start_predefined_shape_definition
+  syn keyword mpDef          stop_predefined_shape_definition
+  syn keyword mpVardef       drawpredefinedline drawpredefinedshape
+  syn keyword mpVardef       some_shape_path
+  syn keyword mpVariable     predefined_shapes predefined_shapes_xradius
+  syn keyword mpVariable     predefined_shapes_xxradius
+  syn keyword mpVariable     predefined_shapes_yradius
+  syn keyword mpVariable     predefined_shapes_yyradius
+  syn keyword mpConstant     context_shap
+  " mp-step.mpiv
+  syn keyword mpDef          initialize_step_variables midbottomboundary
+  syn keyword mpDef          midtopboundary step_begin_cell step_begin_chart
+  syn keyword mpDef          step_cell_ali step_cell_bot step_cell_top
+  syn keyword mpDef          step_cells step_end_cell step_end_chart
+  syn keyword mpDef          step_text_bot step_text_mid step_text_top
+  syn keyword mpDef          step_texts
+  syn keyword mpVariable     cell_distance_x cell_distance_y cell_fill_color
+  syn keyword mpVariable     cell_line_color cell_line_width cell_offset
+  syn keyword mpVariable     chart_align chart_category chart_vertical
+  syn keyword mpVariable     line_distance line_height line_line_color
+  syn keyword mpVariable     line_line_width line_offset nofcells
+  syn keyword mpVariable     text_distance_set text_fill_color text_line_color
+  syn keyword mpVariable     text_line_width text_offset
+  syn keyword mpConstant     context_cell
+  " mp-symb.mpiv
+  syn keyword mpDef          finishglyph prepareglyph
+  syn keyword mpConstant     lefttriangle midbar onebar righttriangle sidebar
+  syn keyword mpConstant     sublefttriangle subrighttriangle twobar
+  " mp-text.mpiv
+  syn keyword mpDef          build_parshape
+  syn keyword mpVardef       found_point
+  syn keyword mpVariable     trace_parshape
+  syn keyword mpConstant     context_text
+  " mp-tool.mpiv
+  syn keyword mpCommand      dump
+  syn keyword mpDef          addbackground b_color beginglyph break centerarrow
+  syn keyword mpDef          clearxy condition data_mpd_file detaileddraw
+  syn keyword mpDef          detailpaths dowithpath draw drawboundary
+  syn keyword mpDef          drawboundingbox drawcontrollines drawcontrolpoints
+  syn keyword mpDef          drawfill draworigin drawpath drawpathonly
+  syn keyword mpDef          drawpathwithpoints drawpoint drawpointlabels
+  syn keyword mpDef          drawpoints drawticks drawwholepath drawxticks
+  syn keyword mpDef          drawyticks endglyph fill finishsavingdata g_color
+  syn keyword mpDef          inner_boundingbox job_name leftarrow loadmodule
+  syn keyword mpDef          midarrowhead naturalizepaths newboolean newcolor
+  syn keyword mpDef          newnumeric newpair newpath newpicture newstring
+  syn keyword mpDef          newtransform normalcolors normaldraw normalfill
+  syn keyword mpDef          normalwithcolor outer_boundingbox pop_boundingbox
+  syn keyword mpDef          popboundingbox popcurrentpicture push_boundingbox
+  syn keyword mpDef          pushboundingbox pushcurrentpicture r_color readfile
+  syn keyword mpDef          recolor redraw refill register_dirty_chars
+  syn keyword mpDef          remapcolor remapcolors remappedcolor reprocess
+  syn keyword mpDef          resetarrows resetcolormap resetdrawoptions
+  syn keyword mpDef          resolvedcolor restroke retext rightarrow savedata
+  syn keyword mpDef          saveoptions scale_currentpicture set_ahlength
+  syn keyword mpDef          set_grid showgrid startplaincompatibility
+  syn keyword mpDef          startsavingdata stopplaincompatibility
+  syn keyword mpDef          stopsavingdata stripe_path_a stripe_path_n undashed
+  syn keyword mpDef          undrawfill untext visualizeddraw visualizedfill
+  syn keyword mpDef          visualizepaths withcolor withgray
+  syn keyword mpDef          xscale_currentpicture xshifted
+  syn keyword mpDef          xyscale_currentpicture yscale_currentpicture
+  syn keyword mpDef          yshifted
+  syn keyword mpVardef       acos acosh anglebetween area arrowhead
+  syn keyword mpVardef       arrowheadonpath arrowpath asciistring asin asinh
+  syn keyword mpVardef       atan basiccolors bbheight bbwidth bcomponent
+  syn keyword mpVardef       blackcolor bottomboundary boundingbox c_phantom
+  syn keyword mpVardef       ccomponent center cleanstring colorcircle
+  syn keyword mpVardef       colordecimals colordecimalslist colorlike colorpart
+  syn keyword mpVardef       colortype complementary complemented copylist cos
+  syn keyword mpVardef       cosh cot cotd curved ddddecimal dddecimal ddecimal
+  syn keyword mpVardef       decorated drawarrowpath epsed exp freedotlabel
+  syn keyword mpVardef       freelabel gcomponent getunstringed grayed greyed
+  syn keyword mpVardef       hsvtorgb infinite innerboundingbox interpolated inv
+  syn keyword mpVardef       invcos inverted invsin invtan laddered leftboundary
+  syn keyword mpVardef       leftpath leftrightpath listsize listtocurves
+  syn keyword mpVardef       listtolines ln log mcomponent new_on_grid
+  syn keyword mpVardef       outerboundingbox paired pen_size penpoint phantom
+  syn keyword mpVardef       pointarrow pow punked rangepath rcomponent
+  syn keyword mpVardef       redecorated repathed rightboundary rightpath
+  syn keyword mpVardef       rotation roundedsquare set_inner_boundingbox
+  syn keyword mpVardef       set_outer_boundingbox setunstringed shapedlist
+  syn keyword mpVardef       simplified sin sinh sortlist sqr straightpath tan
+  syn keyword mpVardef       tand tanh tensecircle thefreelabel topboundary
+  syn keyword mpVardef       tripled undecorated unitvector unspiked unstringed
+  syn keyword mpVardef       whitecolor ycomponent
+  syn keyword mpPrimaryDef   along blownup bottomenlarged cornered crossed
+  syn keyword mpPrimaryDef   enlarged enlonged leftenlarged llenlarged llmoved
+  syn keyword mpPrimaryDef   lrenlarged lrmoved on paralleled randomized
+  syn keyword mpPrimaryDef   randomizedcontrols randomshifted rightenlarged
+  syn keyword mpPrimaryDef   shortened sized smoothed snapped softened squeezed
+  syn keyword mpPrimaryDef   stretched superellipsed topenlarged ulenlarged
+  syn keyword mpPrimaryDef   ulmoved uncolored urenlarged urmoved xsized
+  syn keyword mpPrimaryDef   xstretched xyscaled xysized ysized ystretched zmod
+  syn keyword mpSecondaryDef anglestriped intersection_point numberstriped
+  syn keyword mpSecondaryDef peepholed
+  syn keyword mpTertiaryDef  cutends
+  syn keyword mpNewInternal  ahdimple ahvariant anglelength anglemethod
+  syn keyword mpNewInternal  angleoffset charscale cmykcolormodel graycolormodel
+  syn keyword mpNewInternal  greycolormodel maxdimensions metapostversion
+  syn keyword mpNewInternal  nocolormodel rgbcolormodel striped_normal_inner
+  syn keyword mpNewInternal  striped_normal_outer striped_reverse_inner
+  syn keyword mpNewInternal  striped_reverse_outer
+  syn keyword mpType         grayscale greyscale quadruplet triplet
+  syn keyword mpVariable     ahfactor collapse_data color_map drawoptionsfactor
+  syn keyword mpVariable     freedotlabelsize freelabeloffset grid grid_full
+  syn keyword mpVariable     grid_h grid_left grid_nx grid_ny grid_w grid_x
+  syn keyword mpVariable     grid_y intersection_found originlength
+  syn keyword mpVariable     plain_compatibility_data pointlabelfont
+  syn keyword mpVariable     pointlabelscale refillbackground savingdata
+  syn keyword mpVariable     savingdatadone swappointlabels ticklength tickstep
+  syn keyword mpConstant     CRLF DQUOTE PERCENT SPACE bcircle context_tool crlf
+  syn keyword mpConstant     darkblue darkcyan darkgray darkgreen darkmagenta
+  syn keyword mpConstant     darkred darkyellow downtriangle dquote freesquare
+  syn keyword mpConstant     fulldiamond fullsquare fulltriangle lcircle
+  syn keyword mpConstant     lefttriangle lightgray llcircle lltriangle lrcircle
+  syn keyword mpConstant     lrtriangle mpversion nocolor noline oddly
+  syn keyword mpConstant     originpath percent rcircle righttriangle space
+  syn keyword mpConstant     tcircle triangle ulcircle ultriangle unitcircle
+  syn keyword mpConstant     unitdiamond unittriangle uptriangle urcircle
+  syn keyword mpConstant     urtriangle
+endif " MetaFun macros
 
 " Define the default highlighting
-" Only when an item doesn't have highlighting yet
-
-hi def link mpTeXinsert	String
-hi def link mpTeXbegin	Statement
-hi def link mpTeXend	Statement
-hi def link mpInternal	mfInternal
-hi def link mpMacro	Macro
-
+hi def link mpTeXdelim     mpPrimitive
+hi def link mpBoolExp      mfBoolExp
+hi def link mpNumExp       mfNumExp
+hi def link mpPairExp      mfPairExp
+hi def link mpPathExp      mfPathExp
+hi def link mpPenExp       mfPenExp
+hi def link mpPicExp       mfPicExp
+hi def link mpStringExp    mfStringExp
+hi def link mpInternal     mfInternal
+hi def link mpCommand      mfCommand
+hi def link mpType         mfType
+hi def link mpPrimitive    mfPrimitive
+hi def link mpDef          mfDef
+hi def link mpVardef       mpDef
+hi def link mpPrimaryDef   mpDef
+hi def link mpSecondaryDef mpDef
+hi def link mpTertiaryDef  mpDef
+hi def link mpNewInternal  mpInternal
+hi def link mpVariable     mfVariable
+hi def link mpConstant     mfConstant
+hi def link mpOnOff        mpPrimitive
+hi def link mpDash         mpPrimitive
 
 let b:current_syntax = "mp"
 
-" vim: ts=8
+let &cpo = s:cpo_sav
+unlet! s:cpo_sav
+
+" vim:sw=2