From e4ba18e1fb1f540307565b0d4a64b4dddd03d561 Mon Sep 17 00:00:00 2001 From: Matt Ellis Date: Mon, 16 Jun 2014 17:02:27 +0100 Subject: [PATCH] Syntax highlighting of code blocks MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Code taken from https://github.com/xolox/vim-notes Has to be in plugin/mkd.vim, or the initial BufReadPost event doesn’t get fired. I don’t know why. --- plugin/mkd.vim | 68 +++++++++++++++++++++++++++++++++++++++++++++ syntax/markdown.vim | 4 ++- 2 files changed, 71 insertions(+), 1 deletion(-) create mode 100644 plugin/mkd.vim diff --git a/plugin/mkd.vim b/plugin/mkd.vim new file mode 100644 index 0000000..50bf9a7 --- /dev/null +++ b/plugin/mkd.vim @@ -0,0 +1,68 @@ +" Completely stolen from vim-notes - http://peterodding.com/code/vim/notes/ +function! s:Markdown_highlight_sources(force) + " Syntax highlight source code embedded in notes. + " Look for code blocks in the current file + let filetypes = {} + for line in getline(1, '$') + let ft = matchstr(line, '```\zs\w\+\>') + if ft !~ '^\d*$' | let filetypes[ft] = 1 | endif + endfor + " Don't refresh the highlighting if nothing has changed. + if !a:force && exists('b:mkd_previous_sources') && b:mkd_previous_sources == filetypes + return + else + let b:mkd_previous_sources = filetypes + endif + " Now we're ready to actually highlight the code blocks. + if !empty(filetypes) + let startgroup = 'mkdCodeStart' + let endgroup = 'mkdCodeEnd' + for ft in keys(filetypes) + let group = 'mkdSnippet' . toupper(ft) + let include = s:syntax_include(ft) + let command = 'syntax region %s matchgroup=%s start="^```%s$" matchgroup=%s end="^```$" keepend contains=%s%s' + execute printf(command, group, startgroup, ft, endgroup, include, has('conceal') ? ' concealends' : '') + execute printf('syntax cluster mkdNonListItem add=%s', group) + endfor + endif +endfunction + +function! s:syntax_include(filetype) + " Include the syntax highlighting of another {filetype}. + let grouplistname = '@' . toupper(a:filetype) + " Unset the name of the current syntax while including the other syntax + " because some syntax scripts do nothing when "b:current_syntax" is set + if exists('b:current_syntax') + let syntax_save = b:current_syntax + unlet b:current_syntax + endif + try + execute 'syntax include' grouplistname 'syntax/' . a:filetype . '.vim' + execute 'syntax include' grouplistname 'after/syntax/' . a:filetype . '.vim' + catch /E484/ + " Ignore missing scripts + endtry + " Restore the name of the current syntax + if exists('syntax_save') + let b:current_syntax = syntax_save + elseif exists('b:current_syntax') + unlet b:current_syntax + endif + return grouplistname +endfunction + + +function! s:Markdown_refresh_syntax() + if &filetype == 'mkd' && line('$') > 1 + call s:Markdown_highlight_sources(0) + endif +endfunction + +augroup Mkd + autocmd! + au BufReadPost * call s:Markdown_refresh_syntax() + au BufReadPost,BufWritePost * call s:Markdown_refresh_syntax() + au InsertEnter,InsertLeave * call s:Markdown_refresh_syntax() + au CursorHold,CursorHoldI * call s:Markdown_refresh_syntax() +augroup END + diff --git a/syntax/markdown.vim b/syntax/markdown.vim index 035199b..7244cb5 100644 --- a/syntax/markdown.vim +++ b/syntax/markdown.vim @@ -75,6 +75,8 @@ syn region mkdCode start=/\s*``[^`]*/ end=/[^`]*``\s*/ syn region mkdCode start=/^\s*```\s*[0-9A-Za-z_+-]*\s*$/ end=/^\s*```\s*$/ syn region mkdCode start=/\s*\~\~[^\~]*/ end=/[^\~]*\~\~\s*/ syn region mkdCode start=/^\s*\~\~\~\s*[0-9A-Za-z_+-]*\s*$/ end=/^\s*\~\~\~\s*$/ +syn match mkdCodeStart /^```\w*$/ +syn match mkdCodeEnd /^```$/ syn region mkdCode start="]*>" end="" syn region mkdCode start="]*>" end="" syn region mkdFootnote start="\[^" end="\]" @@ -110,7 +112,7 @@ if get(g:, 'vim_markdown_math', 0) syn region mkdMath matchgroup=mkdDelimiter start="\\\@