Update runtime files
diff --git a/runtime/ftplugin/context.vim b/runtime/ftplugin/context.vim
index 10f1ae1..37f7240 100644
--- a/runtime/ftplugin/context.vim
+++ b/runtime/ftplugin/context.vim
@@ -2,7 +2,7 @@
 " Language:           ConTeXt typesetting engine
 " Maintainer:         Nicola Vitacolonna <nvitacolonna@gmail.com>
 " Former Maintainers: Nikolai Weibull <now@bitwi.se>
-" Latest Revision:    2016 Oct 30
+" Latest Revision:    2021 Oct 15
 
 if exists("b:did_ftplugin")
   finish
@@ -17,7 +17,6 @@
 endif
 
 let b:undo_ftplugin = "setl com< cms< def< inc< sua< fo< ofu<"
-      \ . "| unlet! b:match_ignorecase b:match_words b:match_skip"
 
 setlocal comments=b:%D,b:%C,b:%M,:% commentstring=%\ %s formatoptions+=tjcroql2
 if get(b:, 'context_metapost', get(g:, 'context_metapost', 1))
@@ -35,11 +34,12 @@
 
 setlocal suffixesadd=.tex
 
-if exists("loaded_matchit")
+if exists("loaded_matchit") && !exists("b:match_words")
   let b:match_ignorecase = 0
   let b:match_skip = 'r:\\\@<!\%(\\\\\)*%'
   let b:match_words = '(:),\[:],{:},\\(:\\),\\\[:\\],' .
         \ '\\start\(\a\+\):\\stop\1'
+  let b:undo_ftplugin .= " | unlet! b:match_ignorecase b:match_words b:match_skip"
 endif
 
 let s:context_regex = {
@@ -57,19 +57,28 @@
   call map(range(2, a:count), 'search(s:context_regex[a:what], a:flags)')
 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("no_plugin_maps") && !exists("no_context_maps")
+  " 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>
+
+  let b:undo_ftplugin .= " | sil! exe 'nunmap <buffer> [[' | sil! exe 'vunmap <buffer> [['" .
+	\                " | sil! exe 'nunmap <buffer> ]]' | sil! exe 'vunmap <buffer> ]]'" .
+	\                " | sil! exe 'nunmap <buffer> []' | sil! exe 'vunmap <buffer> []'" .
+	\                " | sil! exe 'nunmap <buffer> ][' | sil! exe 'vunmap <buffer> ]['" .
+	\                " | sil! exe 'nunmap <buffer> [{' | sil! exe 'vunmap <buffer> [{'" .
+	\                " | sil! exe 'nunmap <buffer> ]}' | sil! exe 'vunmap <buffer> ]}'"
+end
 
 " Other useful mappings
 if get(g:, 'context_mappings', 1)
@@ -81,16 +90,22 @@
     call cursor(search(s:tp_regex, 'W') - 1, 1)
   endf
 
-  " Reflow paragraphs with commands like gqtp ("gq TeX paragraph")
-  onoremap <silent><buffer> tp :<c-u>call <sid>tp()<cr>
-  " Select TeX paragraph
-  vnoremap <silent><buffer> tp <esc>:<c-u>call <sid>tp()<cr>
+  if !exists("no_plugin_maps") && !exists("no_context_maps")
+    " Reflow paragraphs with commands like gqtp ("gq TeX paragraph")
+    onoremap <silent><buffer> tp :<c-u>call <sid>tp()<cr>
+    " Select TeX paragraph
+    vnoremap <silent><buffer> tp <esc>:<c-u>call <sid>tp()<cr>
 
-  " $...$ text object
-  onoremap <silent><buffer> i$ :<c-u>normal! T$vt$<cr>
-  onoremap <silent><buffer> a$ :<c-u>normal! F$vf$<cr>
-  vnoremap <buffer> i$ T$ot$
-  vnoremap <buffer> a$ F$of$
+    " $...$ text object
+    onoremap <silent><buffer> i$ :<c-u>normal! T$vt$<cr>
+    onoremap <silent><buffer> a$ :<c-u>normal! F$vf$<cr>
+    vnoremap <buffer> i$ T$ot$
+    vnoremap <buffer> a$ F$of$
+
+    let b:undo_ftplugin .= " | sil! exe 'ounmap <buffer> tp' | sil! exe 'vunmap <buffer> tp'" .
+	  \                " | sil! exe 'ounmap <buffer> i$' | sil! exe 'vunmap <buffer> i$'" .
+	  \                " | sil! exe 'ounmap <buffer> a$' | sil! exe 'vunmap <buffer> a$'"
+    endif
 endif
 
 " Commands for asynchronous typesetting