From: Hiroshi Shirosaki Date: Mon, 25 Jan 2016 09:10:24 +0000 (+0900) Subject: Go to the current header on Toc X-Git-Url: https://git.madduck.net/etc/vim.git/commitdiff_plain/31880b5251ce9153527b7dff9bf1fde6bd840402?ds=sidebyside;hp=--cc Go to the current header on Toc Fix #149 --- 31880b5251ce9153527b7dff9bf1fde6bd840402 diff --git a/ftplugin/markdown.vim b/ftplugin/markdown.vim index 1ce35a8..408d92e 100644 --- a/ftplugin/markdown.vim +++ b/ftplugin/markdown.vim @@ -304,6 +304,8 @@ function! s:Toc(...) let l:bufnr = bufnr('%') + let l:cursor_line = line('.') + let l:cursor_header = 0 let l:fenced_block = 0 let l:front_matter = 0 let l:header_list = [] @@ -340,6 +342,14 @@ function! s:Toc(...) " append line to location list let l:item = {'lnum': i, 'text': l:line, 'valid': 1, 'bufnr': l:bufnr, 'col': 1} let l:header_list = l:header_list + [l:item] + " set header number of the cursor position + if l:cursor_header == 0 + if i == l:cursor_line + let l:cursor_header = len(l:header_list) + elseif i > l:cursor_line + let l:cursor_header = len(l:header_list) - 1 + endif + endif " keep track of the longest header size (heading level + title) let l:total_len = stridx(l:line, ' ') + len(l:line) if l:total_len > l:header_max_len @@ -390,7 +400,7 @@ function! s:Toc(...) endfor setlocal nomodified setlocal nomodifiable - normal! gg + execute 'normal! ' . l:cursor_header . 'G' endfunction " Convert Setex headers in range `line1 .. line2` to Atx. diff --git a/test/toc.vader b/test/toc.vader index 349592f..2510edc 100644 --- a/test/toc.vader +++ b/test/toc.vader @@ -166,3 +166,20 @@ Expect (multiple headers): Execute: :lclose + +Given markdown; +# header 1 + +## header 2 + +### header 3 + +Execute (Toc cursor on the current header): + normal! 4G + :Toc + AssertEqual line('.'), 2 + :lclose + normal! G + :Toc + AssertEqual line('.'), 3 + :lclose