X-Git-Url: https://git.madduck.net/etc/vim.git/blobdiff_plain/a5786589c3c49199828d63ea403238ca95531d0b..1ec89a223c39af3eb4dbf4aff2698878cb03aa9c:/ftplugin/markdown.vim?ds=sidebyside diff --git a/ftplugin/markdown.vim b/ftplugin/markdown.vim index 74bbc54..3f084f2 100644 --- a/ftplugin/markdown.vim +++ b/ftplugin/markdown.vim @@ -302,12 +302,38 @@ function! s:Toc(...) let l:window_type = 'vertical' endif - try - silent lvimgrep /\(^\S.*\(\n[=-]\+\n\)\@=\|^#\+\)/ % - catch /E480/ + + let b:bufnr = bufnr('%') + let b:fenced_block = 0 + let b:header_list = [] + let l:header_max_len = 0 + for i in range(1, line('$')) + let l:lineraw = getline(i) + let l:l1 = getline(i+1) + let l:line = substitute(l:lineraw, "#", "\\\#", "g") + if l:line =~ '````*' || l:line =~ '\~\~\~\~*' + if b:fenced_block == 0 + let b:fenced_block = 1 + elseif b:fenced_block == 1 + let b:fenced_block = 0 + endif + endif + if l:line =~ '^#\+' || (l:l1 =~ '^=\+\s*$' || l:l1 =~ '^-\+\s*$') && l:line =~ '^\S' + let b:is_header = 1 + else + let b:is_header = 0 + endif + if b:is_header == 1 && b:fenced_block == 0 + " append line to location list + let b:item = {'lnum': i, 'text': l:line, 'valid': 1, 'bufnr': b:bufnr, 'col': 1} + let b:header_list = b:header_list + [b:item] + endif + endfor + if len(b:header_list) == 0 echom "Toc: No headers." return - endtry + endif + call setloclist(0, b:header_list) if l:window_type ==# 'horizontal' lopen @@ -555,12 +581,17 @@ 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\w*\>') + 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') @@ -575,9 +606,13 @@ function! s:Markdown_highlight_sources(force) let endgroup = 'mkdCodeEnd' for ft in keys(filetypes) if a:force || !has_key(b:mkd_known_filetypes, ft) - - let group = 'mkdSnippet' . toupper(ft) - let include = s:syntax_include(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)