X-Git-Url: https://git.madduck.net/etc/vim.git/blobdiff_plain/87633369306b4872c652faa56049a95660287047..627fb41f4d2a172a41345520fcf9ed1f29aed4a6:/ftplugin/markdown.vim diff --git a/ftplugin/markdown.vim b/ftplugin/markdown.vim index 7eb5784..9e4db2d 100644 --- a/ftplugin/markdown.vim +++ b/ftplugin/markdown.vim @@ -553,3 +553,84 @@ command! -buffer Toc call s:Toc() command! -buffer Toch call s:Toc('horizontal') command! -buffer Tocv call s:Toc('vertical') command! -buffer Toct call s:Toc('tab') + +" Heavily based on vim-notes - http://peterodding.com/code/vim/notes/ +let s:filetype_dict = { + \ 'c++': 'cpp', + \ 'viml': 'vim' +\ } + +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[0-9A-Za-z_+-]*') + if !empty(ft) && ft !~ '^\d*$' | let filetypes[ft] = 1 | endif + endfor + if !exists('b:mkd_known_filetypes') + let b:mkd_known_filetypes = {} + endif + if !a:force && (b:mkd_known_filetypes == filetypes || empty(filetypes)) + return + endif + + " Now we're ready to actually highlight the code blocks. + let startgroup = 'mkdCodeStart' + let endgroup = 'mkdCodeEnd' + for ft in keys(filetypes) + if a:force || !has_key(b:mkd_known_filetypes, ft) + if has_key(s:filetype_dict, ft) + let filetype = s:filetype_dict[ft] + else + let filetype = ft + endif + let group = 'mkdSnippet' . toupper(substitute(filetype, "[+-]", "_", "g")) + let include = s:syntax_include(filetype) + 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) + + let b:mkd_known_filetypes[ft] = 1 + endif + endfor +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(force) + if &filetype == 'markdown' && line('$') > 1 + call s:Markdown_highlight_sources(a:force) + endif +endfunction + +augroup Mkd + autocmd! + au BufWinEnter * call s:Markdown_refresh_syntax(1) + au BufWritePost * call s:Markdown_refresh_syntax(0) + au InsertEnter,InsertLeave * call s:Markdown_refresh_syntax(0) + au CursorHold,CursorHoldI * call s:Markdown_refresh_syntax(0) +augroup END