From: Ciro Santilli Date: Tue, 3 Jun 2014 15:19:52 +0000 (+0200) Subject: Merge patched pull request #80 from fmoralesc:patch-1 X-Git-Url: https://git.madduck.net/etc/vim.git/commitdiff_plain/2b23ddcf1883b57a779e005c8883892a6d3c5695?hp=1c2cccbafbbd74407d3d2209e77143a4e8207584 Merge patched pull request #80 from fmoralesc:patch-1 --- diff --git a/README.md b/README.md index 24c5c6c..1c5b246 100644 --- a/README.md +++ b/README.md @@ -69,8 +69,6 @@ The following work on normal and visual modes: ## Commands -The following commands currently only work for atx style headers (`#`). Pull request are welcome to extend them to Setext style headers (`===`). - - `:Toc`: create a quickfix vertical window navigable table of contents with the headers. Hit `` on a line to jump to the corresponding line of the markdown file. diff --git a/ftplugin/mkd.vim b/ftplugin/mkd.vim index 9c07714..b18f3be 100644 --- a/ftplugin/mkd.vim +++ b/ftplugin/mkd.vim @@ -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