changeset 11347:4aae8146c21f

Update runtime files. commit https://github.com/vim/vim/commit/cd5c8f82507822467232ab71e1ebbaae19595916 Author: Bram Moolenaar <Bram@vim.org> Date: Sun Apr 9 20:11:58 2017 +0200 Update runtime files.
author Christian Brabandt <cb@256bit.org>
date Sun, 09 Apr 2017 20:15:03 +0200
parents 75f4dd526eb8
children 4e5191165707
files runtime/compiler/rst.vim runtime/doc/autocmd.txt runtime/doc/eval.txt runtime/doc/insert.txt runtime/doc/pattern.txt runtime/doc/todo.txt runtime/indent/r.vim runtime/indent/rhelp.vim runtime/macros/less.vim runtime/syntax/autohotkey.vim runtime/syntax/r.vim runtime/syntax/rmd.vim
diffstat 12 files changed, 318 insertions(+), 131 deletions(-) [+]
line wrap: on
line diff
--- a/runtime/compiler/rst.vim
+++ b/runtime/compiler/rst.vim
@@ -1,7 +1,8 @@
 " Vim compiler file
-" Compiler:             reStructuredText Documentation Format
+" Compiler:             sphinx >= 1.0.8, http://www.sphinx-doc.org
+" Description:          reStructuredText Documentation Format
 " Previous Maintainer:  Nikolai Weibull <now@bitwi.se>
-" Latest Revision:      2006-04-19
+" Latest Revision:      2017-03-31
 
 if exists("current_compiler")
   finish
@@ -11,12 +12,18 @@ let current_compiler = "rst"
 let s:cpo_save = &cpo
 set cpo&vim
 
-setlocal errorformat=
-      \%f:%l:\ (%tEBUG/0)\ %m,
-      \%f:%l:\ (%tNFO/1)\ %m,
-      \%f:%l:\ (%tARNING/2)\ %m,
-      \%f:%l:\ (%tRROR/3)\ %m,
-      \%f:%l:\ (%tEVERE/3)\ %m,
+if exists(":CompilerSet") != 2
+  command -nargs=* CompilerSet setlocal <args>
+endif
+
+CompilerSet errorformat=
+      \%f\\:%l:\ %tEBUG:\ %m,
+      \%f\\:%l:\ %tNFO:\ %m,
+      \%f\\:%l:\ %tARNING:\ %m,
+      \%f\\:%l:\ %tRROR:\ %m,
+      \%f\\:%l:\ %tEVERE:\ %m,
+      \%f\\:%s:\ %tARNING:\ %m,
+      \%f\\:%s:\ %tRROR:\ %m,
       \%D%*\\a[%*\\d]:\ Entering\ directory\ `%f',
       \%X%*\\a[%*\\d]:\ Leaving\ directory\ `%f',
       \%DMaking\ %*\\a\ in\ %f
--- a/runtime/doc/autocmd.txt
+++ b/runtime/doc/autocmd.txt
@@ -1,4 +1,4 @@
-*autocmd.txt*   For Vim version 8.0.  Last change: 2017 Jan 14
+*autocmd.txt*   For Vim version 8.0.  Last change: 2017 Apr 07
 
 
 		  VIM REFERENCE MANUAL    by Bram Moolenaar
@@ -621,7 +621,7 @@ FileChangedShell		When Vim notices that 
 				to tell Vim what to do next.
 				NOTE: When this autocommand is executed, the
 				current buffer "%" may be different from the
-				buffer that was changed "<afile>".
+				buffer that was changed, which is in "<afile>".
 				NOTE: The commands must not change the current
 				buffer, jump to another buffer or delete a
 				buffer.  *E246* *E811*
--- a/runtime/doc/eval.txt
+++ b/runtime/doc/eval.txt
@@ -1,4 +1,4 @@
-*eval.txt*	For Vim version 8.0.  Last change: 2017 Mar 27
+*eval.txt*	For Vim version 8.0.  Last change: 2017 Apr 09
 
 
 		  VIM REFERENCE MANUAL	  by Bram Moolenaar
@@ -4379,12 +4379,14 @@ getcurpos()	Get the position of the curs
 		includes an extra item in the list:
 		    [bufnum, lnum, col, off, curswant] ~
 		The "curswant" number is the preferred column when moving the
-		cursor vertically.
+		cursor vertically.  Also see |getpos()|.
+
 		This can be used to save and restore the cursor position: >
 			let save_cursor = getcurpos()
 			MoveTheCursorAround
 			call setpos('.', save_cursor)
-<
+<		Note that this only works within the window.  See
+		|winrestview()| for restoring more state.
 							*getcwd()*
 getcwd([{winnr} [, {tabnr}]])
 		The result is a String, which is the name of the current
@@ -4682,13 +4684,16 @@ gettabwinvar({tabnr}, {winnr}, {varname}
 <
 							*getwinposx()*
 getwinposx()	The result is a Number, which is the X coordinate in pixels of
-		the left hand side of the GUI Vim window.  The result will be
-		-1 if the information is not available.
+		the left hand side of the GUI Vim window. Also works for an
+		xterm.
+		The result will be -1 if the information is not available.
+		The value can be used with `:winpos`.
 
 							*getwinposy()*
 getwinposy()	The result is a Number, which is the Y coordinate in pixels of
-		the top of the GUI Vim window.  The result will be -1 if the
-		information is not available.
+		the top of the GUI Vim window.  Also works for an xterm.
+		The result will be -1 if the information is not available.
+		The value can be used with `:winpos`.
 
 getwininfo([{winid}])					*getwininfo()*
 		Returns information about windows as a List with Dictionaries.
@@ -5304,13 +5309,29 @@ json_decode({string})					*json_decode()
 		in Vim values.  See |json_encode()| for the relation between
 		JSON and Vim values.
 		The decoding is permissive:
-		- A trailing comma in an array and object is ignored.
+		- A trailing comma in an array and object is ignored, e.g.
+		  "[1, 2, ]" is the same as "[1, 2]".
 		- More floating point numbers are recognized, e.g. "1." for
-		  "1.0".
-		However, a duplicate key in an object is not allowed. *E938*
-		The result must be a valid Vim type:
-		- An empty object member name is not allowed.
-		- Duplicate object member names are not allowed.
+		  "1.0", or "001.2" for "1.2". Special floating point values
+		  "Infinity" and "NaN" (capitalization ignored) are accepted.
+		- Leading zeroes in integer numbers are ignored, e.g. "012"
+		  for "12" or "-012" for "-12".
+		- Capitalization is ignored in literal names null, true or
+		  false, e.g. "NULL" for "null", "True" for "true".
+		- Control characters U+0000 through U+001F which are not
+		  escaped in strings are accepted, e.g. "	" (tab
+		  character in string) for "\t".
+		- Backslash in an invalid 2-character sequence escape is
+		  ignored, e.g. "\a" is decoded as "a".
+		- A correct surrogate pair in JSON strings should normally be
+		  a 12 character sequence such as "\uD834\uDD1E", but
+		  json_decode() silently accepts truncated surrogate pairs
+		  such as "\uD834" or "\uD834\u"
+								*E938*
+		A duplicate key in an object, valid in rfc7159, is not
+		accepted by json_decode() as the result must be a valid Vim
+		type, e.g. this fails: {"a":"b", "a":"c"}
+
 
 json_encode({expr})					*json_encode()*
 		Encode {expr} as JSON and return this as a string.
@@ -7879,7 +7900,6 @@ test_override({name}, {val})				*test_ov
 
 		name	     effect when {val} is non-zero ~
 		redraw       disable the redrawing() function
-		silent_mode  enable silent mode (like using |-s| after |-e|)
 		char_avail   disable the char_avail() function
 		ALL	     clear all overrides ({val} is not used)
 
@@ -8473,7 +8493,7 @@ listcmds		Compiled with commands for the
 			and the argument list |arglist|.
 localmap		Compiled with local mappings and abbr. |:map-local|
 lua			Compiled with Lua interface |Lua|.
-mac			Any Macintosh version of Vim.
+mac			Any Macintosh version of Vim, but not all OS X.
 macunix			Compiled for OS X, with darwin
 osx			Compiled for OS X, with or without darwin
 menu			Compiled with support for |:menu|.
@@ -10650,6 +10670,22 @@ missing: >
 	:  echo "You will _never_ see this message"
 	:endif
 
+To execute a command only when the |+eval| feature is disabled requires a trick,
+as this example shows: >
+	if 1
+	  nnoremap : :"
+	endif
+	normal :set history=111<CR>
+	if 1
+	  nunmap :
+	endif
+
+The "<CR>" here is a real CR character, type CTRL-V Enter to get it.
+
+When the |+eval| feature is available the ":" is remapped to add a double
+quote, which has the effect of commenging-out the command.  without the
+|+eval| feature the nnoremap command is skipped and the command is executed.
+
 ==============================================================================
 11. The sandbox					*eval-sandbox* *sandbox* *E48*
 
--- a/runtime/doc/insert.txt
+++ b/runtime/doc/insert.txt
@@ -1,4 +1,4 @@
-*insert.txt*    For Vim version 8.0.  Last change: 2016 Jan 31
+*insert.txt*    For Vim version 8.0.  Last change: 2017 Apr 07
 
 
 		  VIM REFERENCE MANUAL    by Bram Moolenaar
@@ -159,7 +159,8 @@ CTRL-R CTRL-R {0-9a-z"%#*+/:.-=}			*i_CT
 CTRL-R CTRL-O {0-9a-z"%#*+/:.-=}			*i_CTRL-R_CTRL-O*
 		Insert the contents of a register literally and don't
 		auto-indent.  Does the same as pasting with the mouse
-		|<MiddleMouse>|.
+		|<MiddleMouse>|. When the register is linewise this will
+		insert the text above the current line, like with `P`.
 		Does not replace characters!
 		The '.' register (last inserted text) is still inserted as
 		typed.  {not in Vi}
--- a/runtime/doc/pattern.txt
+++ b/runtime/doc/pattern.txt
@@ -1,4 +1,4 @@
-*pattern.txt*   For Vim version 8.0.  Last change: 2017 Mar 05
+*pattern.txt*   For Vim version 8.0.  Last change: 2017 Mar 29
 
 
 		  VIM REFERENCE MANUAL    by Bram Moolenaar
--- a/runtime/doc/todo.txt
+++ b/runtime/doc/todo.txt
@@ -1,4 +1,4 @@
-*todo.txt*      For Vim version 8.0.  Last change: 2017 Mar 29
+*todo.txt*      For Vim version 8.0.  Last change: 2017 Apr 09
 
 
 		  VIM REFERENCE MANUAL	  by Bram Moolenaar
@@ -35,6 +35,8 @@ entered there will not be repeated below
 							*known-bugs*
 -------------------- Known bugs and current work -----------------------
 
+Remove the Farsi code?
+
 +channel:
 - Try out background make plugin: 
   https://github.com/AndrewVos/vim-make-background
@@ -110,9 +112,6 @@ manager.  Problem with Motif?
 
 Memory leak in test97?  The string is actually freed.  Weird.
 
-Patch for deleting the quickfix lists and a test for it. (Yegappan, 2017 Mar
-21)
-
 Add a toolbar in the terminal.  Can be global, above all windows, or specific
 for one window.
 Use tb_set(winid, [{'text': 'stop', 'cb': callback, 'hi': 'Green'}])
@@ -122,16 +121,8 @@ Use tb_set(winid, [{'text': 'stop', 'cb'
 json_encode(): should convert to utf-8. (Nikolai Pavlov, 2016 Jan 23)
 What if there is an invalid character?
 
-Patch for broken foldtext. (Christian 2017 Mar 22, #1567, 2nd one)
-
 Json string with trailing \u should be an error. (Lcd)
 
-On MS-Windows with 'clipboard' set to "unnamed" this doesn't work to double
-lines: :g/^/normal yyp   On Unix it works OK.  (Bryce Orgill, 2016 Nov 5)
-Another example 2017 Mar 10.
-
-Multi-byte bug: dv} splits char. (Urtica Dioica, 2017 Jan 9)
-
 When session file has name in argument list but the buffer was deleted, the
 buffer is not deleted when using the session file. (#1393)
 Should add the buffer in hidden state.
@@ -139,10 +130,6 @@ Should add the buffer in hidden state.
 When an item in the quickfix list has a file name that does not exist, behave
 like the item was not a match for :cnext.
 
-Patch to test regexp classes. (Dominique, 2017 Mar 13, #1560)
-Do we need to adjust the implementation?
-Make different classes that depend on the system and that don't.
-
 Wrong diff highlighting with three files. (2016 Oct 20, #1186)
 Also get E749 on exit.
 Another example in #1309
@@ -150,21 +137,12 @@ Another example in #1309
 Patch to change all use of &sw to shiftwidth(). (Tyru, 2017 Feb 19)
 Wait until maintainers integrate it.
 
-Patch to change mb_char2len() to utf_char2len(c) when known to use UTF.
-(Dominique, 2017 Mar 21, #1582)
-
-Completion for user-defined commands does not work if a few characters were
-already typed. (Dominique, 2017 Jan 26)
-
 When deleting a mark or register, leave a tombstone, so that it's also deleted
 when writing viminfo (and the delete was the most recent action). #1339
 
 Suggestion to improve pt-br spell checking. (Marcelo D Montu, 2016 Dec 15,
 #1330)
 
-Patch to Modernize GtkForm Implmentation. (Kazuki Kuriyama, 2017 Mar 26)
-Any objections?
-
 Error in test_startup_utf8 on Solaris. (Danek Duvall, 2016 Aug 17)
 
 Completion for :!cmd shows each match twice. #1435
--- a/runtime/indent/r.vim
+++ b/runtime/indent/r.vim
@@ -274,7 +274,7 @@ function GetRIndent()
         let nlnum = s:Get_prev_line(nlnum)
         let nline = SanitizeRLine(getline(nlnum)) . nline
       endwhile
-      if nline =~ '^\s*function\s*(' && indent(nlnum) == &sw
+      if nline =~ '^\s*function\s*(' && indent(nlnum) == shiftwidth()
         return 0
       endif
     endif
@@ -285,7 +285,7 @@ function GetRIndent()
 
   " line is an incomplete command:
   if line =~ '\<\(if\|while\|for\|function\)\s*()$' || line =~ '\<else$' || line =~ '<-$' || line =~ '->$'
-    return indent(lnum) + &sw
+    return indent(lnum) + shiftwidth()
   endif
 
   " Deal with () and []
@@ -293,14 +293,14 @@ function GetRIndent()
   let pb = s:Get_paren_balance(line, '(', ')')
 
   if line =~ '^\s*{$' || line =~ '(\s*{' || (pb == 0 && (line =~ '{$' || line =~ '(\s*{$'))
-    return indent(lnum) + &sw
+    return indent(lnum) + shiftwidth()
   endif
 
   let s:curtabstop = repeat(' ', &tabstop)
 
   if g:r_indent_align_args == 1
     if pb > 0 && line =~ '{$'
-      return s:Get_last_paren_idx(line, '(', ')', pb) + &sw
+      return s:Get_last_paren_idx(line, '(', ')', pb) + shiftwidth()
     endif
 
     let bb = s:Get_paren_balance(line, '[', ']')
@@ -364,11 +364,11 @@ function GetRIndent()
       if oline =~ g:r_indent_op_pattern && s:Get_paren_balance(line, "(", ")") == 0
         return indent(lnum)
       else
-        return indent(lnum) + &sw
+        return indent(lnum) + shiftwidth()
       endif
     else
       if oline =~ g:r_indent_op_pattern && s:Get_paren_balance(line, "(", ")") == 0
-        return indent(lnum) - &sw
+        return indent(lnum) - shiftwidth()
       endif
     endif
   endif
@@ -383,7 +383,7 @@ function GetRIndent()
       let line = linepiece . line
     endwhile
     if line =~ '{$' && post_block == 0
-      return indent(lnum) + &sw
+      return indent(lnum) + shiftwidth()
     endif
 
     " Now we can do some tests again
@@ -393,19 +393,19 @@ function GetRIndent()
     if post_block == 0
       let newl = SanitizeRLine(line)
       if newl =~ '\<\(if\|while\|for\|function\)\s*()$' || newl =~ '\<else$' || newl =~ '<-$'
-        return indent(lnum) + &sw
+        return indent(lnum) + shiftwidth()
       endif
     endif
   endif
 
   if cline =~ '^\s*else'
     if line =~ '<-\s*if\s*()'
-      return indent(lnum) + &sw
+      return indent(lnum) + shiftwidth()
     else
       if line =~ '\<if\s*()'
         return indent(lnum)
       else
-        return indent(lnum) - &sw
+        return indent(lnum) - shiftwidth()
       endif
     endif
   endif
@@ -474,12 +474,12 @@ function GetRIndent()
   let ind = indent(lnum)
 
   if g:r_indent_align_args == 0 && pb != 0
-    let ind += pb * &sw
+    let ind += pb * shiftwidth()
     return ind
   endif
 
   if g:r_indent_align_args == 0 && bb != 0
-    let ind += bb * &sw
+    let ind += bb * shiftwidth()
     return ind
   endif
 
@@ -489,7 +489,7 @@ function GetRIndent()
     let pind = 0
   endif
 
-  if ind == pind || (ind == (pind  + &sw) && pline =~ '{$' && ppost_else == 0)
+  if ind == pind || (ind == (pind  + shiftwidth()) && pline =~ '{$' && ppost_else == 0)
     return ind
   endif
 
@@ -509,7 +509,7 @@ function GetRIndent()
       let pbb = s:Get_paren_balance(pline, '[', ']')
     endwhile
     let pind = indent(plnum)
-    if ind == (pind  + &sw) && pline =~ '{$'
+    if ind == (pind  + shiftwidth()) && pline =~ '{$'
       return ind
     endif
   endwhile
--- a/runtime/indent/rhelp.vim
+++ b/runtime/indent/rhelp.vim
@@ -82,7 +82,7 @@ function GetRHelpIndent()
   let closeb = strlen(line2) - strlen(line3)
   let bb = openb - closeb
 
-  let ind = indent(lnum) + (bb * &sw)
+  let ind = indent(lnum) + (bb * shiftwidth())
 
   if line =~ '^\s*}\s*$'
     let ind = indent(lnum)
--- a/runtime/macros/less.vim
+++ b/runtime/macros/less.vim
@@ -1,6 +1,6 @@
 " Vim script to work like "less"
 " Maintainer:	Bram Moolenaar <Bram@vim.org>
-" Last Change:	2015 Nov 15
+" Last Change:	2017 Mar 31
 
 " Avoid loading this file twice, allow the user to define his own script.
 if exists("loaded_less")
@@ -81,6 +81,10 @@ fun! s:Help()
   echo "\n"
   echo "/pattern  Search for pattern        ?pattern  Search backward for pattern"
   echo "n         next pattern match        N         Previous pattern match"
+  if &foldmethod != "manual"
+  echo "\n"
+    echo "zR        open all folds            zm        increase fold level"
+  endif
   echo "\n"
   echo ":n<Enter> Next file                 :p<Enter> Previous file"
   echo "\n"
@@ -96,7 +100,11 @@ map <C-F> <Space>
 map <PageDown> <Space>
 map <kPageDown> <Space>
 map <S-Down> <Space>
-map z <Space>
+" If 'foldmethod' was changed keep the "z" commands, e.g. "zR" to open all
+" folds.
+if &foldmethod == "manual"
+  map z <Space>
+endif
 map <Esc><Space> <Space>
 fun! s:NextPage()
   if line(".") == line("$")
--- a/runtime/syntax/autohotkey.vim
+++ b/runtime/syntax/autohotkey.vim
@@ -2,7 +2,7 @@
 " Language:         AutoHotkey script file
 " Maintainer:       Michael Wong
 "                   https://github.com/mmikeww/autohotkey.vim
-" Latest Revision:  2017-01-23
+" Latest Revision:  2017-04-03
 " Previous Maintainers:       SungHyun Nam <goweol@gmail.com>
 "                             Nikolai Weibull <now@bitwi.se>
 
@@ -106,6 +106,7 @@ syn keyword autohotkeyCommand
       \ FormatTime IfInString IfNotInString Sort StringCaseSense StringGetPos
       \ StringLeft StringRight StringLower StringUpper StringMid StringReplace
       \ StringSplit StringTrimLeft StringTrimRight StringLen
+      \ StrSplit StrReplace Throw
       \ Control ControlClick ControlFocus ControlGet ControlGetFocus
       \ ControlGetPos ControlGetText ControlMove ControlSend ControlSendRaw
       \ ControlSetText Menu PostMessage SendMessage SetControlDelay
@@ -119,17 +120,18 @@ syn keyword autohotkeyCommand
       \ SetCapsLockState SetNumLockState SetScrollLockState
 
 syn keyword autohotkeyFunction
-      \ InStr RegExMatch RegExReplace StrLen SubStr Asc Chr
+      \ InStr RegExMatch RegExReplace StrLen SubStr Asc Chr Func
       \ DllCall VarSetCapacity WinActive WinExist IsLabel OnMessage 
       \ Abs Ceil Exp Floor Log Ln Mod Round Sqrt Sin Cos Tan ASin ACos ATan
       \ FileExist GetKeyState NumGet NumPut StrGet StrPut RegisterCallback
       \ IsFunc Trim LTrim RTrim IsObject Object Array FileOpen
       \ ComObjActive ComObjArray ComObjConnect ComObjCreate ComObjGet
       \ ComObjError ComObjFlags ComObjQuery ComObjType ComObjValue ComObject
+      \ Format Exception
 
 syn keyword autohotkeyStatement
       \ Break Continue Exit ExitApp Gosub Goto OnExit Pause Return
-      \ Suspend Reload
+      \ Suspend Reload new class extends
 
 syn keyword autohotkeyRepeat
       \ Loop
@@ -138,7 +140,7 @@ syn keyword autohotkeyConditional
       \ IfExist IfNotExist If IfEqual IfLess IfGreater Else
       \ IfWinExist IfWinNotExist IfWinActive IfWinNotActive
       \ IfNotEqual IfLessOrEqual IfGreaterOrEqual
-      \ while until for in
+      \ while until for in try catch finally
 
 syn match   autohotkeyPreProcStart
       \ nextgroup=
@@ -178,7 +180,7 @@ syn keyword autohotkeyPreProc
       \ Warn
 
 syn keyword autohotkeyMatchClass
-      \ ahk_group ahk_class ahk_id ahk_pid
+      \ ahk_group ahk_class ahk_id ahk_pid ahk_exe
 
 syn match   autohotkeyNumbers
       \ display
@@ -217,7 +219,7 @@ syn match   autohotkeyHotkey
       \ contains=autohotkeyKey,
       \   autohotkeyHotkeyDelimiter
       \ display
-      \ '^.\{-}::'
+      \ '^\s*\S*\%( Up\)\?::'
 
 syn match   autohotkeyKey
       \ contained
--- a/runtime/syntax/r.vim
+++ b/runtime/syntax/r.vim
@@ -5,10 +5,10 @@
 " 		      Tom Payne <tom@tompayne.org>
 " Contributor:        Johannes Ranke <jranke@uni-bremen.de>
 " Homepage:           https://github.com/jalvesaq/R-Vim-runtime
-" Last Change:	      Thu Aug 25, 2016  08:52PM
+" Last Change:	      Sat Apr 08, 2017  07:01PM
 " Filenames:	      *.R *.r *.Rhistory *.Rt
 "
-" NOTE: The highlighting of R functions is defined in
+" NOTE: The highlighting of R functions might be defined in
 " runtime files created by a filetype plugin, if installed.
 "
 " CONFIGURATION:
@@ -18,7 +18,7 @@
 "
 "   ROxygen highlighting can be turned off by
 "
-"      let r_hl_roxygen = 0
+"      let r_syntax_hl_roxygen = 0
 "
 " Some lines of code were borrowed from Zhuojun Chen.
 
@@ -26,13 +26,25 @@ if exists("b:current_syntax")
   finish
 endif
 
-syn iskeyword @,48-57,_,.
+if has("patch-7.4.1142")
+  syn iskeyword @,48-57,_,.
+else
+  setlocal iskeyword=@,48-57,_,.
+endif
+
+" The variables g:r_hl_roxygen and g:r_syn_minlines were renamed on April 8, 2017.
+if exists("g:r_hl_roxygen")
+  let g:r_syntax_hl_roxygen = g:r_hl_roxygen
+endif
+if exists("g:r_syn_minlines")
+  let g:r_syntax_minlines = g:r_syn_minlines
+endif
 
 if exists("g:r_syntax_folding") && g:r_syntax_folding
   setlocal foldmethod=syntax
 endif
-if !exists("g:r_hl_roxygen")
-  let g:r_hl_roxygen = 1
+if !exists("g:r_syntax_hl_roxygen")
+  let g:r_syntax_hl_roxygen = 1
 endif
 
 syn case match
@@ -42,19 +54,106 @@ syn match rCommentTodo contained "\(BUG\
 syn match rComment contains=@Spell,rCommentTodo,rOBlock "#.*"
 
 " Roxygen
-if g:r_hl_roxygen
-  syn region rOBlock start="^\s*\n#\{1,2}' " start="\%^#\{1,2}' " end="^\(#\{1,2}'\)\@!" contains=rOTitle,rOKeyword,rOExamples,@Spell keepend
-  syn region rOTitle start="^\s*\n#\{1,2}' " start="\%^#\{1,2}' " end="^\(#\{1,2}'\s*$\)\@=" contained contains=rOCommentKey
-  syn match rOCommentKey "#\{1,2}'" containedin=rOTitle contained
+if g:r_syntax_hl_roxygen
+  " A roxygen block can start at the beginning of a file (first version) and
+  " after a blank line (second version). It ends when a line that does not
+  " contain a roxygen comment. In the following comments, any line containing
+  " a roxygen comment marker (one or two hash signs # followed by a single
+  " quote ' and preceded only by whitespace) is called a roxygen line. A
+  " roxygen line containing only a roxygen comment marker, optionally followed
+  " by whitespace is called an empty roxygen line.
+
+  " First we match all roxygen blocks as containing only a title. In case an
+  " empty roxygen line ending the title or a tag is found, this will be
+  " overriden later by the definitions of rOBlock.
+  syn match rOTitleBlock "\%^\(\s*#\{1,2}' .*\n\)\{1,}" contains=rOCommentKey,rOTitleTag
+  syn match rOTitleBlock "^\s*\n\(\s*#\{1,2}' .*\n\)\{1,}" contains=rOCommentKey,rOTitleTag
+
+  " When a roxygen block has a title and additional content, the title
+  " consists of one or more roxygen lines (as little as possible are matched),
+  " followed either by an empty roxygen line
+  syn region rOBlock start="\%^\(\s*#\{1,2}' .*\n\)\{-1,}\s*#\{1,2}'\s*$" end="^\s*\(#\{1,2}'\)\@!" contains=rOTitle,rOTag,rOExamples,@Spell keepend fold
+  syn region rOBlock start="^\s*\n\(\s*#\{1,2}' .*\n\)\{-1,}\s*#\{1,2}'\s*$" end="^\s*\(#\{1,2}'\)\@!" contains=rOTitle,rOTag,rOExamples,@Spell keepend fold
 
-  syn region rOExamples start="^#\{1,2}' @examples.*"rs=e+1,hs=e+1 end="^\(#\{1,2}' @.*\)\@=" end="^\(#\{1,2}'\)\@!" contained contains=rOKeyword
+  " or by a roxygen tag (we match everything starting with @ but not @@ which is used as escape sequence for a literal @).
+  syn region rOBlock start="\%^\(\s*#\{1,2}' .*\n\)\{-}\s*#\{1,2}' @\(@\)\@!" end="^\s*\(#\{1,2}'\)\@!" contains=rOTitle,rOTag,rOExamples,@Spell keepend fold
+  syn region rOBlock start="^\s*\n\(\s*#\{1,2}' .*\n\)\{-}\s*#\{1,2}' @\(@\)\@!" end="^\s*\(#\{1,2}'\)\@!" contains=rOTitle,rOTag,rOExamples,@Spell keepend fold
+
+  " If a block contains an @rdname, @describeIn tag, it may have paragraph breaks, but does not have a title
+  syn region rOBlockNoTitle start="\%^\(\s*#\{1,2}' .*\n\)\{-1,}\s*#\{1,2}'\s*\n\(\s*#\{1,2}'.*\n\)\{-}\s*#\{1,2}' @rdname" end="^\s*\(#\{1,2}'\)\@!" contains=rOTag,rOExamples,@Spell keepend fold
+  syn region rOBlockNoTitle start="^\s*\n\(\s*#\{1,2}' .*\n\)\{-1,}\s*#\{1,2}'\s*\n\(\s*#\{1,2}'.*\n\)\{-}\s*#\{1,2}' @rdname" end="^\s*\(#\{1,2}'\)\@!" contains=rOTag,rOExamples,@Spell keepend fold
+  syn region rOBlockNoTitle start="\%^\(\s*#\{1,2}' .*\n\)\{-1,}\s*#\{1,2}'\s*\n\(\s*#\{1,2}'.*\n\)\{-}\s*#\{1,2}' @describeIn" end="^\s*\(#\{1,2}'\)\@!" contains=rOTag,rOExamples,@Spell keepend fold
+  syn region rOBlockNoTitle start="^\s*\n\(\s*#\{1,2}' .*\n\)\{-1,}\s*#\{1,2}'\s*\n\(\s*#\{1,2}'.*\n\)\{-}\s*#\{1,2}' @describeIn" end="^\s*\(#\{1,2}'\)\@!" contains=rOTag,rOExamples,@Spell keepend fold
+
+  " A title as part of a block is always at the beginning of the block, i.e.
+  " either at the start of a file or after a completely empty line.
+  syn match rOTitle "\%^\(\s*#\{1,2}' .*\n\)\{-1,}\s*#\{1,2}'\s*$" contained contains=rOCommentKey,rOTitleTag
+  syn match rOTitle "^\s*\n\(\s*#\{1,2}' .*\n\)\{-1,}\s*#\{1,2}'\s*$" contained contains=rOCommentKey,rOTitleTag
+  syn match rOTitleTag contained "@title"
+
+  syn match rOCommentKey "#\{1,2}'" contained
+  syn region rOExamples start="^#\{1,2}' @examples.*"rs=e+1,hs=e+1 end="^\(#\{1,2}' @.*\)\@=" end="^\(#\{1,2}'\)\@!" contained contains=rOTag fold
+
+  " rOTag list generated from the lists in
+  " https://github.com/klutometis/roxygen/R/rd.R and
+  " https://github.com/klutometis/roxygen/R/namespace.R
+  " using s/^    \([A-Za-z0-9]*\) = .*/  syn match rOTag contained "@\1"/
+  " Plus we need the @include tag
 
-  syn match rOKeyword contained "@\(param\|return\|name\|rdname\|examples\|example\|include\|docType\)"
-  syn match rOKeyword contained "@\(S3method\|TODO\|aliases\|alias\|assignee\|author\|callGraphDepth\|callGraph\)"
-  syn match rOKeyword contained "@\(callGraphPrimitives\|concept\|exportClass\|exportMethod\|exportPattern\|export\|formals\)"
-  syn match rOKeyword contained "@\(format\|importClassesFrom\|importFrom\|importMethodsFrom\|import\|keywords\|useDynLib\)"
-  syn match rOKeyword contained "@\(method\|noRd\|note\|references\|seealso\|setClass\|slot\|source\|title\|usage\)"
-  syn match rOKeyword contained "@\(family\|template\|templateVar\|description\|details\|inheritParams\|field\)"
+  " rd.R
+  syn match rOTag contained "@aliases"
+  syn match rOTag contained "@author"
+  syn match rOTag contained "@backref"
+  syn match rOTag contained "@concept"
+  syn match rOTag contained "@describeIn"
+  syn match rOTag contained "@description"
+  syn match rOTag contained "@details"
+  syn match rOTag contained "@docType"
+  syn match rOTag contained "@encoding"
+  syn match rOTag contained "@evalRd"
+  syn match rOTag contained "@example"
+  syn match rOTag contained "@examples"
+  syn match rOTag contained "@family"
+  syn match rOTag contained "@field"
+  syn match rOTag contained "@format"
+  syn match rOTag contained "@inherit"
+  syn match rOTag contained "@inheritParams"
+  syn match rOTag contained "@inheritDotParams"
+  syn match rOTag contained "@inheritSection"
+  syn match rOTag contained "@keywords"
+  syn match rOTag contained "@method"
+  syn match rOTag contained "@name"
+  syn match rOTag contained "@md"
+  syn match rOTag contained "@noMd"
+  syn match rOTag contained "@noRd"
+  syn match rOTag contained "@note"
+  syn match rOTag contained "@param"
+  syn match rOTag contained "@rdname"
+  syn match rOTag contained "@rawRd"
+  syn match rOTag contained "@references"
+  syn match rOTag contained "@return"
+  syn match rOTag contained "@section"
+  syn match rOTag contained "@seealso"
+  syn match rOTag contained "@slot"
+  syn match rOTag contained "@source"
+  syn match rOTag contained "@template"
+  syn match rOTag contained "@templateVar"
+  syn match rOTag contained "@title"
+  syn match rOTag contained "@usage"
+  " namespace.R
+  syn match rOTag contained "@export"
+  syn match rOTag contained "@exportClass"
+  syn match rOTag contained "@exportMethod"
+  syn match rOTag contained "@exportPattern"
+  syn match rOTag contained "@import"
+  syn match rOTag contained "@importClassesFrom"
+  syn match rOTag contained "@importFrom"
+  syn match rOTag contained "@importMethodsFrom"
+  syn match rOTag contained "@rawNamespace"
+  syn match rOTag contained "@S3method"
+  syn match rOTag contained "@useDynLib"
+  " other
+  syn match rOTag contained "@include"
 endif
 
 
@@ -168,12 +267,28 @@ syn match rBraceError "[)}]" contained
 syn match rCurlyError "[)\]]" contained
 syn match rParenError "[\]}]" contained
 
-if !exists("g:R_hi_fun")
-  let g:R_hi_fun = 1
+" Use Nvim-R to highlight functions dynamically if it is installed
+if !exists("g:r_syntax_fun_pattern")
+  let s:ff = split(substitute(globpath(&rtp, "R/functions.vim"), "functions.vim", "", "g"), "\n")
+  if len(s:ff) > 0
+    let g:r_syntax_fun_pattern = 0
+  else
+    let g:r_syntax_fun_pattern = 1
+  endif
 endif
-if g:R_hi_fun
-  " Nvim-R:
-  runtime R/functions.vim
+
+" Only use Nvim-R to highlight functions if they should not be highlighted
+" according to a generic pattern
+if g:r_syntax_fun_pattern == 1
+  syn match rFunction '[0-9a-zA-Z_\.]\+\s*\ze('
+else
+  if !exists("g:R_hi_fun")
+    let g:R_hi_fun = 1
+  endif
+  if g:R_hi_fun
+    " Nvim-R:
+    runtime R/functions.vim
+  endif
 endif
 
 syn match rDollar display contained "\$"
@@ -205,8 +320,8 @@ if &filetype == "rhelp"
   syn match rhSection "\\dontrun\>"
 endif
 
-if exists("r_syn_minlines")
-  exe "syn sync minlines=" . r_syn_minlines
+if exists("r_syntax_minlines")
+  exe "syn sync minlines=" . r_syntax_minlines
 else
   syn sync minlines=40
 endif
@@ -243,15 +358,17 @@ hi def link rStatement   Statement
 hi def link rString      String
 hi def link rStrError    Error
 hi def link rType        Type
-if g:r_hl_roxygen
-  hi def link rOKeyword    Title
-  hi def link rOBlock      Comment
+if g:r_syntax_hl_roxygen
+  hi def link rOTitleTag   Operator
+  hi def link rOTag        Operator
+  hi def link rOTitleBlock Title
+  hi def link rOBlock         Comment
+  hi def link rOBlockNoTitle  Comment
   hi def link rOTitle      Title
   hi def link rOCommentKey Comment
   hi def link rOExamples   SpecialComment
 endif
 
-
 let b:current_syntax="r"
 
 " vim: ts=8 sw=2
--- a/runtime/syntax/rmd.vim
+++ b/runtime/syntax/rmd.vim
@@ -1,17 +1,26 @@
 " markdown Text with R statements
 " Language: markdown with R code chunks
 " Homepage: https://github.com/jalvesaq/R-Vim-runtime
-" Last Change: Tue Jun 28, 2016  10:09AM
+" Last Change: Sat Jan 28, 2017  10:06PM
 "
 " CONFIGURATION:
-"   To highlight chunk headers as R code, put in your vimrc:
+"   To highlight chunk headers as R code, put in your vimrc (e.g. .config/nvim/init.vim):
 "   let rmd_syn_hl_chunk = 1
+"
+"   For highlighting pandoc extensions to markdown like citations and TeX and
+"   many other advanced features like folding of markdown sections, it is
+"   recommended to install the vim-pandoc filetype plugin as well as the
+"   vim-pandoc-syntax filetype plugin from https://github.com/vim-pandoc.
+"
+" TODO:
+"   - Provide highlighting for rmarkdown parameters in yaml header
 
 if exists("b:current_syntax")
   finish
 endif
 
-" load all of pandoc info
+" load all of pandoc info, e.g. from
+" https://github.com/vim-pandoc/vim-pandoc-syntax
 runtime syntax/pandoc.vim
 if exists("b:current_syntax")
   let rmdIsPandoc = 1
@@ -22,28 +31,54 @@ else
   if exists("b:current_syntax")
     unlet b:current_syntax
   endif
-endif
 
-" load all of the r syntax highlighting rules into @R
-syntax include @R syntax/r.vim
-if exists("b:current_syntax")
-  unlet b:current_syntax
+  " load all of the yaml syntax highlighting rules into @yaml
+  syntax include @yaml syntax/yaml.vim
+  if exists("b:current_syntax")
+    unlet b:current_syntax
+  endif
+
+  " highlight yaml block commonly used for front matter
+  syntax region rmdYamlBlock matchgroup=rmdYamlBlockDelim start="^---" matchgroup=rmdYamlBlockDelim end="^---" contains=@yaml keepend fold
 endif
 
-if exists("g:rmd_syn_hl_chunk")
-  " highlight R code inside chunk header
-  syntax match rmdChunkDelim "^[ \t]*```{r" contained
-  syntax match rmdChunkDelim "}$" contained
+if !exists("g:rmd_syn_langs")
+  let g:rmd_syn_langs = ["r"]
 else
-  syntax match rmdChunkDelim "^[ \t]*```{r.*}$" contained
+  let s:hasr = 0
+  for s:lng in g:rmd_syn_langs
+    if s:lng == "r"
+      let s:hasr = 1
+    endif
+  endfor
+  if s:hasr == 0
+    let g:rmd_syn_langs += ["r"]
+  endif
 endif
-syntax match rmdChunkDelim "^[ \t]*```$" contained
-syntax region rmdChunk start="^[ \t]*``` *{r.*}$" end="^[ \t]*```$" contains=@R,rmdChunkDelim keepend fold
+
+for s:lng in g:rmd_syn_langs
+  exe 'syntax include @' . toupper(s:lng) . ' syntax/'. s:lng . '.vim'
+  if exists("b:current_syntax")
+    unlet b:current_syntax
+  endif
+  exe 'syntax region rmd' . toupper(s:lng) . 'Chunk start="^[ \t]*``` *{\(' . s:lng . '\|r.*engine\s*=\s*["' . "']" . s:lng . "['" . '"]\).*}$" end="^[ \t]*```$" contains=@' . toupper(s:lng) . ',rmd' . toupper(s:lng) . 'ChunkDelim keepend fold'
+
+  if exists("g:rmd_syn_hl_chunk") && s:lng == "r"
+    " highlight R code inside chunk header
+    syntax match rmdRChunkDelim "^[ \t]*```{r" contained
+    syntax match rmdRChunkDelim "}$" contained
+  else
+    exe 'syntax match rmd' . toupper(s:lng) . 'ChunkDelim "^[ \t]*```{\(' . s:lng . '\|r.*engine\s*=\s*["' . "']" . s:lng . "['" . '"]\).*}$" contained'
+  endif
+  exe 'syntax match rmd' . toupper(s:lng) . 'ChunkDelim "^[ \t]*```$" contained'
+endfor
+
 
 " also match and syntax highlight in-line R code
-syntax match rmdEndInline "`" contained
-syntax match rmdBeginInline "`r " contained
-syntax region rmdrInline start="`r "  end="`" contains=@R,rmdBeginInline,rmdEndInline keepend
+syntax region rmdrInline matchgroup=rmdInlineDelim start="`r "  end="`" contains=@R containedin=pandocLaTeXRegion,yamlFlowString keepend
+" I was not able to highlight rmdrInline inside a pandocLaTeXCommand, although
+" highlighting works within pandocLaTeXRegion and yamlFlowString. 
+syntax cluster texMathZoneGroup add=rmdrInline
 
 " match slidify special marker
 syntax match rmdSlidifySpecial "\*\*\*"
@@ -56,8 +91,6 @@ if rmdIsPandoc == 0
   if exists("b:current_syntax")
     unlet b:current_syntax
   endif
-  " Extend cluster
-  syn cluster texMathZoneGroup add=rmdrInline
   " Inline
   syntax match rmdLaTeXInlDelim "\$"
   syntax match rmdLaTeXInlDelim "\\\$"
@@ -65,19 +98,24 @@ if rmdIsPandoc == 0
   " Region
   syntax match rmdLaTeXRegDelim "\$\$" contained
   syntax match rmdLaTeXRegDelim "\$\$latex$" contained
-  syntax region rmdLaTeXRegion start="^\$\$" skip="\\\$" end="\$\$$" contains=@LaTeX,rmdLaTeXSt,rmdLaTeXRegDelim keepend
-  syntax region rmdLaTeXRegion2 start="^\\\[" end="\\\]" contains=@LaTeX,rmdLaTeXSt,rmdLaTeXRegDelim keepend
+  syntax match rmdLaTeXSt "\\[a-zA-Z]\+"
+  syntax region rmdLaTeXRegion start="^\$\$" skip="\\\$" end="\$\$$" contains=@LaTeX,rmdLaTeXRegDelim keepend
+  syntax region rmdLaTeXRegion2 start="^\\\[" end="\\\]" contains=@LaTeX,rmdLaTeXRegDelim keepend
+  hi def link rmdBlockQuote Comment
   hi def link rmdLaTeXSt Statement
   hi def link rmdLaTeXInlDelim Special
   hi def link rmdLaTeXRegDelim Special
 endif
 
-syn sync match rmdSyncChunk grouphere rmdChunk "^[ \t]*``` *{r"
+for s:lng in g:rmd_syn_langs
+  exe 'syn sync match rmd' . toupper(s:lng) . 'SyncChunk grouphere rmd' . toupper(s:lng) . 'Chunk /^[ \t]*``` *{\(' . s:lng . '\|r.*engine\s*=\s*["' . "']" . s:lng . "['" . '"]\)/'
+endfor
 
-hi def link rmdChunkDelim Special
-hi def link rmdBeginInline Special
-hi def link rmdEndInline Special
-hi def link rmdBlockQuote Comment
+hi def link rmdYamlBlockDelim Delim
+for s:lng in g:rmd_syn_langs
+  exe 'hi def link rmd' . toupper(s:lng) . 'ChunkDelim Special'
+endfor
+hi def link rmdInlineDelim Special
 hi def link rmdSlidifySpecial Special
 
 let b:current_syntax = "rmd"