Toc: Pass errors if no atx headers are processed.
If you use [Vundle](https://github.com/gmarik/vundle), add the following line to your `~/.vimrc`:
+ Plugin 'godlygeek/tabular'
Plugin 'plasticboy/vim-markdown'
-And then run inside Vim:
+The `tabular` plugin come *before* `vim-markdown`.
+
+Then run inside Vim:
:so ~/.vimrc
:PluginInstall
## Commands
-- `:Toc`: create a quickfix vertical window navigable table of contents with the headers.
+- `:HeaderDecrease`:
- Hit `<Enter>` on a line to jump to the corresponding line of the markdown file.
+ Decrease level of all headers in buffer: `h2` to `h1`, `h3` to `h2`, etc.
-- `: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`.
+ If range is given, only operate in the range.
+
+ If an `h1` would be decreased, abort.
+
+ For simplicity of implementation, Setex headers are converted to Atx.
+
+- `:HeaderIncrease`: Analogous to `:HeaderDecrease`, but increase levels instead.
- `:SetexToAtx`:
If a range is given, e.g. hit `:` from visual mode, only operate on the range.
-- `:HeaderDecrease`:
+- `:TableFormat`: Format the table under the cursor [like this](http://www.cirosantilli.com/markdown-styleguide/#tables).
- Decrease level of all headers in buffer: `h2` to `h1`, `h3` to `h2`, etc.
+ Requires [Tabular](https://github.com/godlygeek/tabular).
- If range is given, only operate in the range.
+ The input table *must* already have a separator line as the second line of the table.
+ That line only needs to contain the correct pipes `|`, nothing else is required.
- If an `h1` would be decreased, abort.
+- `:Toc`: create a quickfix vertical window navigable table of contents with the headers.
- For simplicity of implementation, Setex headers are converted to Atx.
+ Hit `<Enter>` on a line to jump to the corresponding line of the markdown file.
-- `:HeaderIncrease`: Analogous to `:HeaderDecrease`, but increase levels instead.
+- `: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
" For each level, contains the regexp that matches at that level only.
let s:levelRegexpDict = {
- \ 1: '\v^(#[^#]|.+\n\=+$)',
- \ 2: '\v^(##[^#]|.+\n-+$)',
- \ 3: '\v^###[^#]',
- \ 4: '\v^####[^#]',
- \ 5: '\v^#####[^#]',
- \ 6: '\v^######[^#]'
+ \ 1: '\v^(#[^#]@=|.+\n\=+$)',
+ \ 2: '\v^(##[^#]@=|.+\n-+$)',
+ \ 3: '\v^###[^#]@=',
+ \ 4: '\v^####[^#]@=',
+ \ 5: '\v^#####[^#]@=',
+ \ 6: '\v^######[^#]@='
\ }
" Maches any header level of any type.
endif
try
- silent vimgrep /\(^\S.*\(\n[=-]\+\)\@=\|^#\+\)/ %
+ silent lvimgrep /\(^\S.*\(\n[=-]\+\n\)\@=\|^#\+\)/ %
catch /E480/
echom "Toc: No headers."
return
endtry
if l:window_type ==# 'horizontal'
- copen
+ lopen
elseif l:window_type ==# 'vertical'
- vertical copen
+ vertical lopen
let &winwidth=(&columns/2)
elseif l:window_type ==# 'tab'
- tab copen
+ tab lopen
else
- copen
+ lopen
endif
set modifiable
%s/\v^([^|]*\|){2,2} #//e
for i in range(1, line('$'))
- " this is the quickfix data for the current item
- let d = getqflist()[i-1]
+ " this is the location-list data for the current item
+ let d = getloclist(0)[i-1]
" atx headers
if match(d.text, "^#") > -1
let l:level = len(matchstr(d.text, '#*', 'g'))-1
endfor
let l:numSubstitutions = s:SetexToAtx(a:line1, a:line2)
for l:level in range(replaceLevels[0], replaceLevels[1], -l:levelDelta)
- execute 'silent! ' . a:line1 . ',' . (a:line2 - l:numSubstitutions) . 'substitute/' . s:levelRegexpDict[l:level] . '/' . repeat('#', l:level + l:levelDelta) . '\1/g'
+ execute 'silent! ' . a:line1 . ',' . (a:line2 - l:numSubstitutions) . 'substitute/' . s:levelRegexpDict[l:level] . '/' . repeat('#', l:level + l:levelDelta) . '/g'
endfor
endfunction
+" Format table under cursor.
+" Depends on Tabularize.
+function! s:TableFormat()
+ let l:pos = getpos('.')
+ normal! {
+ " Search instead of `normal! j` because of the table at beginning of file edge case.
+ call search('|')
+ normal! j
+ " Remove everything that is not a pipe othewise well formated tables would grow
+ " because of addition of 2 spaces on the separator line by Tabularize /|.
+ s/[^|]//g
+ Tabularize /|
+ s/ /-/g
+ call setpos('.', l:pos)
+endfunction
+
call <sid>MapNormVis('<Plug>(Markdown_MoveToNextHeader)', '<sid>Markdown_MoveToNextHeader')
call <sid>MapNormVis('<Plug>(Markdown_MoveToPreviousHeader)', '<sid>Markdown_MoveToPreviousHeader')
call <sid>MapNormVis('<Plug>(Markdown_MoveToNextSiblingHeader)', '<sid>Markdown_MoveToNextSiblingHeader')
vmap <buffer> ]c <Plug>(Markdown_MoveToCurHeader)
endif
+command! -buffer -range=% HeaderDecrease call s:HeaderDecrease(<line1>, <line2>)
+command! -buffer -range=% HeaderIncrease call s:HeaderDecrease(<line1>, <line2>, 1)
+command! -buffer -range=% SetexToAtx call s:SetexToAtx(<line1>, <line2>)
+command! -buffer TableFormat call s:TableFormat()
command! -buffer Toc call s:Markdown_Toc()
command! -buffer Toch call s:Markdown_Toc('horizontal')
command! -buffer Tocv call s:Markdown_Toc('vertical')
command! -buffer Toct call s:Markdown_Toc('tab')
-command! -buffer -range=% SetexToAtx call s:SetexToAtx(<line1>, <line2>)
-command! -buffer -range=% HeaderDecrease call s:HeaderDecrease(<line1>, <line2>)
-command! -buffer -range=% HeaderIncrease call s:HeaderDecrease(<line1>, <line2>, 1)
if exists("*GetMkdIndent") | finish | endif
function! s:is_li_start(line)
- return a:line =~ '^\s*[\*+-]'
+ return a:line !~ '^ *\([*-]\)\%( *\1\)\{2}\%( \|\1\)*$' &&
+ \ a:line =~ '^\s*[*+-] \+'
endfunction
function! s:is_blank_line(line)
" Accept various markers as bullets
setlocal comments=b:*,b:+,b:-
+" Automatically continue blockquote on line break
+setlocal comments+=b:>
+
let b:current_syntax = "mkd"
delcommand HtmlHiLink
--- /dev/null
+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.
+
+---
+
+ATX tests.
+
+# h1 space
+
+#h1 nospace
+
+# h1 2 spaces
+
+# h1 trailing hash #
+
+## h2 space
+
+##h2 nospace
+
+## h2 trailing hash ##
+
+### h3 space
+
+###h3 nospace
+
+### h3 trailing hash ###
+
+#### h4
+
+##### h5
+
+###### h6
+
+---
+
+Relative positions.
+
+# h1 before h2
+
+## h2 between h1s
+
+# h1 after h2
+
+---
+
+Setex tests.
+
+setex h1
+========
+
+setex h2
+--------
+
+setex h1 single punctuation
+=
+
+setex h1 punctuation longer than header
+================================
+
+Prevent list vs Setex confusion:
+
+- not Setex
+- because list
+
+---
+
+Mixed tests.
+
+setex h1 before atx
+===================
+
+## atx h2
+
+### atx h3
+
+# atx h1
+
+setex h2
+------------------
+
+### atx h3 2
--- /dev/null
+1. Confirm indent with new line insert after list items
+
+'\' is not list item.
+\ foo
+
+If only space and three '*' or '-' character are in the line,
+this line means horizontal item.
+If current line is below horizontal item, it need not to indent.
+Following example is horizontal item.
+
+---
+***
+- - -
+* * *
+
+And list item must be specified space after [*-+].
+Following example is list item.
+
+* foo
+- bar
++ baz
+
+But following example is not list item.
+*foo
+-bar
++baz
+++ /dev/null
-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
--- /dev/null
+| normal |no space| 2 spaces ||
+| - |-| --- ||
+| normal |no space| 2 spaces ||
+
+The table above is the first thing in the file.
+
+The following table is already well formatted. It should not be modified:
+
+| a | b |
+|---|---|
+| c | d |
+
+The following table is the last thing in the file:
+
+| normal |no space| 2 spaces ||
+| - |-| --- ||
+| normal |no space| 2 spaces ||