let g:vim_markdown_initial_foldlevel=1
```
+ **Disable Default Key Mappings**
+
+ Add the following line to your `.vimrc` to disable default key mappings. You can map them by yourself with `<Plug>` mappings
+
+ ```vim
+ let g:markdown_no_default_key_mappings=1
+ ```
+
## Mappings
The following work on normal and visual modes:
- - `]]`: go to next header.
- - `[[`: go to previous header. Contrast with `]c`.
- - `][`: go to next sibling header if any.
- - `[]`: go to previous sibling header if any.
- - `]c`: go to Current header.
- - `]u`: go to parent header (Up).
+ - `]]`: go to next header. `<Plug>(Markdown_MoveToNextHeader)`
+ - `[[`: go to previous header. Contrast with `]c`. `<Plug>(Markdown_MoveToPreviousHeader)`
+ - `][`: go to next sibling header if any. `<Plug>(Markdown_MoveToNextSiblingHeader)`
+ - `[]`: go to previous sibling header if any. `<Plug>(Markdown_MoveToPreviousSiblingHeader)`
+ - `]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:
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)
execute 'vn <buffer><silent> ' . a:rhs . ' <esc>:call <sid>VisMove(''' . a:lhs . ''')<cr>'
endfunction
- call <sid>MapNormVis(']]', 'b:Markdown_MoveToNextHeader')
- call <sid>MapNormVis('[[', 'b:Markdown_MoveToPreviousHeader')
- call <sid>MapNormVis('][', 'b:Markdown_MoveToNextSiblingHeader')
- call <sid>MapNormVis('[]', 'b:Markdown_MoveToPreviousSiblingHeader')
+
+ call <sid>MapNormVis('<Plug>(Markdown_MoveToNextHeader)', 'b:Markdown_MoveToNextHeader')
+ call <sid>MapNormVis('<Plug>(Markdown_MoveToPreviousHeader)', 'b:Markdown_MoveToPreviousHeader')
+ call <sid>MapNormVis('<Plug>(Markdown_MoveToNextSiblingHeader)', 'b:Markdown_MoveToNextSiblingHeader')
+ call <sid>MapNormVis('<Plug>(Markdown_MoveToPreviousSiblingHeader)', 'b:Markdown_MoveToPreviousSiblingHeader')
" Menmonic: Up
- call <sid>MapNormVis(']u', 'b:Markdown_MoveToParentHeader')
+ call <sid>MapNormVis('<Plug>(Markdown_MoveToParentHeader)', 'b:Markdown_MoveToParentHeader')
" Menmonic: Current
- call <sid>MapNormVis(']c', 'b:Markdown_MoveToCurHeader')
+ call <sid>MapNormVis('<Plug>(Markdown_MoveToCurHeader)', 'b:Markdown_MoveToCurHeader')
+
+ if ! exists('g:markdown_no_default_key_mappings')
+ \ || !g:markdown_no_default_key_mappings
+ nmap ]] <Plug>(Markdown_MoveToNextHeader)
+ nmap [[ <Plug>(Markdown_MoveToPreviousHeader)
+ nmap ][ <Plug>(Markdown_MoveToNextSiblingHeader)
+ nmap [] <Plug>(Markdown_MoveToPreviousSiblingHeader)
+ nmap ]u <Plug>(Markdown_MoveToParentHeader)
+ nmap ]c <Plug>(Markdown_MoveToCurHeader)
+
+ vmap ]] <Plug>(Markdown_MoveToNextHeader)
+ vmap [[ <Plug>(Markdown_MoveToPreviousHeader)
+ vmap ][ <Plug>(Markdown_MoveToNextSiblingHeader)
+ vmap [] <Plug>(Markdown_MoveToPreviousSiblingHeader)
+ 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')