X-Git-Url: https://git.madduck.net/etc/vim.git/blobdiff_plain/b2c8143cd2f575012f16e60bba020e311e86097f..7b213323a86d88810aa2f97f15f5079c67cf3d48:/ftplugin/mkd.vim diff --git a/ftplugin/mkd.vim b/ftplugin/mkd.vim index 9c07714..ee861e7 100644 --- a/ftplugin/mkd.vim +++ b/ftplugin/mkd.vim @@ -47,12 +47,12 @@ " For each level, contains the regexp that matches at that level only. let s:levelRegexpDict = { - \ 1: '\v^(\s*#[^#]|.+\n\=+$)', - \ 2: '\v^(\s*##[^#]|.+\n-+$)', - \ 3: '\v^\s*###[^#]', - \ 4: '\v^\s*####[^#]', - \ 5: '\v^\s*#####[^#]', - \ 6: '\v^\s*######[^#]' + \ 1: '\v^(#[^#]|.+\n\=+$)', + \ 2: '\v^(##[^#]|.+\n-+$)', + \ 3: '\v^###[^#]', + \ 4: '\v^####[^#]', + \ 5: '\v^#####[^#]', + \ 6: '\v^######[^#]' \ } " Maches any header level of any type. @@ -60,7 +60,7 @@ let s:levelRegexpDict = { " This could be deduced from `s:levelRegexpDict`, but it is more " efficient to have a single regexp for this. " -let s:headersRegexp = '\v^(\s*#|.+\n(\=+|-+)$)' +let s:headersRegexp = '\v^(#|.+\n(\=+|-+)$)' " Returns the line number of the first header before `line`, called the " current header. @@ -300,7 +300,14 @@ function! s:Markdown_Toc(...) else let l:window_type = 'vertical' endif - silent vimgrep '^#' % + + try + silent vimgrep /\(^\S.*\(\n[=-]\+\)\@=\|^#\+\)/ % + catch /E480/ + echom "Toc: No headers." + return + endtry + if l:window_type ==# 'horizontal' copen elseif l:window_type ==# 'vertical' @@ -314,13 +321,23 @@ function! s:Markdown_Toc(...) set modifiable %s/\v^([^|]*\|){2,2} #// for i in range(1, line('$')) - let l:line = getline(i) - let l:header = matchstr(l:line, '^#*') - let l:length = len(l:header) - let l:line = substitute(l:line, '\v^#*[ ]*', '', '') - let l:line = substitute(l:line, '\v[ ]*#*$', '', '') - let l:line = repeat(' ', (2 * l:length)) . l:line - call setline(i, l:line) + " this is the quickfix data for the current item + let d = getqflist()[i-1] + " atx headers + if match(d.text, "^#") > -1 + let l:level = len(matchstr(d.text, '#*', 'g'))-1 + let d.text = substitute(d.text, '\v^#*[ ]*', '', '') + let d.text = substitute(d.text, '\v[ ]*#*$', '', '') + " setex headers + else + let l:next_line = getbufline(bufname(d.bufnr), d.lnum+1) + if match(l:next_line, "=") > -1 + let l:level = 0 + elseif match(l:next_line, "-") > -1 + let l:level = 1 + endif + endif + call setline(i, repeat(' ', l:level). d.text) endfor set nomodified set nomodifiable @@ -351,21 +368,20 @@ call MapNormVis('(Markdown_MoveToParentHeader)', 'Markdown_MoveT " Menmonic: Current call MapNormVis('(Markdown_MoveToCurHeader)', 'Markdown_MoveToCurHeader') -if ! exists('g:vim_markdown_no_default_key_mappings') -\ || !g:vim_markdown_no_default_key_mappings - nmap ]] (Markdown_MoveToNextHeader) - nmap [[ (Markdown_MoveToPreviousHeader) - nmap ][ (Markdown_MoveToNextSiblingHeader) - nmap [] (Markdown_MoveToPreviousSiblingHeader) - nmap ]u (Markdown_MoveToParentHeader) - nmap ]c (Markdown_MoveToCurHeader) +if !get(g:, 'vim_markdown_no_default_key_mappings', 0) + nmap ]] (Markdown_MoveToNextHeader) + nmap [[ (Markdown_MoveToPreviousHeader) + nmap ][ (Markdown_MoveToNextSiblingHeader) + nmap [] (Markdown_MoveToPreviousSiblingHeader) + nmap ]u (Markdown_MoveToParentHeader) + nmap ]c (Markdown_MoveToCurHeader) - vmap ]] (Markdown_MoveToNextHeader) - vmap [[ (Markdown_MoveToPreviousHeader) - vmap ][ (Markdown_MoveToNextSiblingHeader) - vmap [] (Markdown_MoveToPreviousSiblingHeader) - vmap ]u (Markdown_MoveToParentHeader) - vmap ]c (Markdown_MoveToCurHeader) + vmap ]] (Markdown_MoveToNextHeader) + vmap [[ (Markdown_MoveToPreviousHeader) + vmap ][ (Markdown_MoveToNextSiblingHeader) + vmap [] (Markdown_MoveToPreviousSiblingHeader) + vmap ]u (Markdown_MoveToParentHeader) + vmap ]c (Markdown_MoveToCurHeader) endif command! -buffer Toc call s:Markdown_Toc()