-" Completely stolen from vim-notes - http://peterodding.com/code/vim/notes/
-function! s:Markdown_highlight_sources(force)
+" Heavily based on vim-notes - http://peterodding.com/code/vim/notes/
+function! s:Markdown_highlight_sources()
" 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
+ let ft = matchstr(line, '```\zs\w*\>')
+ if !empty(ft) && 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
+ if !exists('b:mkd_known_filetypes')
+ let b:mkd_known_filetypes = {}
+ endif
+ if b:mkd_known_filetypes == filetypes || empty(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 startgroup = 'mkdCodeStart'
+ let endgroup = 'mkdCodeEnd'
+ for ft in keys(filetypes)
+ if !has_key(b:mkd_known_filetypes, ft)
+
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'
+ let command = 'syntax region %s matchgroup=%s start="^\s*```%s$" matchgroup=%s end="\s*```$" 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
+
+ let b:mkd_known_filetypes[ft] = 1
+ endif
+ endfor
endfunction
function! s:syntax_include(filetype)
function! s:Markdown_refresh_syntax()
if &filetype == 'mkd' && line('$') > 1
- call s:Markdown_highlight_sources(0)
+ call s:Markdown_highlight_sources()
endif
endfunction
au InsertEnter,InsertLeave * call s:Markdown_refresh_syntax()
au CursorHold,CursorHoldI * call s:Markdown_refresh_syntax()
augroup END
-