]> git.madduck.net Git - etc/vim.git/commitdiff

madduck's git repository

Every one of the projects in this repository is available at the canonical URL git://git.madduck.net/madduck/pub/<projectpath> — see each project's metadata for the exact URL.

All patches and comments are welcome. Please squash your changes to logical commits before using git-format-patch and git-send-email to patches@git.madduck.net. If you'd read over the Git project's submission guidelines and adhered to them, I'd be especially grateful.

SSH access, as well as push access can be individually arranged.

If you use my repositories frequently, consider adding the following snippet to ~/.gitconfig and using the third clone URL listed for each project:

[url "git://git.madduck.net/madduck/"]
  insteadOf = madduck:

Merge branch 'mapping'
authorHiroshi Shirosaki <h.shirosaki@gmail.com>
Thu, 3 Apr 2014 04:30:06 +0000 (13:30 +0900)
committerHiroshi Shirosaki <h.shirosaki@gmail.com>
Thu, 3 Apr 2014 04:30:06 +0000 (13:30 +0900)
Conflicts:
ftplugin/mkd.vim

README.md
ftplugin/mkd.vim
test/multiple_headers.md [new file with mode: 0644]

index cc1f7ef96ad2b16fe77cd453b96a55fd53408771..b004bbc539744d9efb0f3ecb514fbed6666d1dac 100644 (file)
--- a/README.md
+++ b/README.md
@@ -67,6 +67,18 @@ The following work on normal and visual modes:
 - `]c`: go to Current header. `<Plug>(Markdown_MoveToCurHeader)`
 - `]u`: go to parent header (Up). `<Plug>(Markdown_MoveToParentHeader)`
 
+## 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 `<Enter>` on a line to jump to the corresponding line of the markdown file.
+
+- `:Toch`: Same as `:Toc` but in an horizontal window.
+- `:Toct`: Same as `:Toc` but in a new tab.
+- `:Tocv`: Same as `:Toc` for symmetry with `:Toch` and `Tocv`.
+
 ## Credits
 
 The main contributors of vim-markdown are:
index 0627cc525f2f307ecf9bf31ab532ed85b98a526d..c7bac4e6dd716b9101ad2cd7b5301a8d424f9c1b 100644 (file)
@@ -294,6 +294,39 @@ function! b:Markdown_MoveToPreviousSiblingHeader()
     endif
 endfunction
 
+function! b:Markdown_Toc(...)
+    if a:0 > 0
+        let l:window_type = a:1
+    else
+        let l:window_type = 'vertical'
+    endif
+    silent vimgrep '^#' %
+    if l:window_type ==# 'horizontal'
+        copen
+    elseif l:window_type ==# 'vertical'
+        vertical copen
+        let &winwidth=(&columns/2)
+    elseif l:window_type ==# 'tab'
+        tab copen
+    else
+        copen
+    endif
+    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)
+    endfor
+    set nomodified
+    set nomodifiable
+    normal! gg
+endfunction
+
 " Wrapper to do move commands in visual mode.
 "
 function! s:VisMove(f)
@@ -334,3 +367,8 @@ if ! exists('g:markdown_no_default_key_mappings')
     vmap ]u <Plug>(Markdown_MoveToParentHeader)
     vmap ]c <Plug>(Markdown_MoveToCurHeader)
 endif
+
+command! -buffer Toc call b:Markdown_Toc()
+command! -buffer Toch call b:Markdown_Toc('horizontal')
+command! -buffer Tocv call b:Markdown_Toc('vertical')
+command! -buffer Toct call b:Markdown_Toc('tab')
diff --git a/test/multiple_headers.md b/test/multiple_headers.md
new file mode 100644 (file)
index 0000000..b6a403a
--- /dev/null
@@ -0,0 +1,27 @@
+This file is used for tests which require there to be multiple headers in different relative positions to each other.
+
+Each header should have an unique text that identifies it.
+
+# h1 space
+
+#h1 nospace
+
+# h1 trailing hash #
+
+## h2 space
+
+##h2 nospace
+
+## h2 trailing hash ##
+
+### h3 space
+
+###h3 nospace
+
+### h3 trailing hash ###
+
+# h1 before h2
+
+## h2 between h1s
+
+# h1 after h2