From: Matt Ellis Date: Wed, 18 Jun 2014 09:37:51 +0000 (+0100) Subject: Only include syntax files once X-Git-Url: https://git.madduck.net/etc/vim.git/commitdiff_plain/3696e02d661de558d068d3b88d6fb1bc81c90f3c?ds=sidebyside Only include syntax files once Avoids errors when including more than once, e.g. including vim twice causes errors --- diff --git a/plugin/mkd.vim b/plugin/mkd.vim index 50bf9a7..4542ced 100644 --- a/plugin/mkd.vim +++ b/plugin/mkd.vim @@ -1,30 +1,34 @@ -" 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" 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 + + let b:mkd_known_filetypes[ft] = 1 + endif + endfor endfunction function! s:syntax_include(filetype) @@ -54,7 +58,7 @@ endfunction function! s:Markdown_refresh_syntax() if &filetype == 'mkd' && line('$') > 1 - call s:Markdown_highlight_sources(0) + call s:Markdown_highlight_sources() endif endfunction @@ -65,4 +69,3 @@ augroup Mkd au InsertEnter,InsertLeave * call s:Markdown_refresh_syntax() au CursorHold,CursorHoldI * call s:Markdown_refresh_syntax() augroup END -