From: Ciro Santilli Date: Sun, 7 Sep 2014 16:01:43 +0000 (+0200) Subject: Merge pull request #103 from fmoralesc/patch-1 X-Git-Url: https://git.madduck.net/etc/vim.git/commitdiff_plain/5da9db319c1c4382c8f9f55b3bf12917f001fbd7?hp=664ccc032cf1a97062e20128182df59d1e3526d4 Merge pull request #103 from fmoralesc/patch-1 Toc: Pass errors if no atx headers are processed. --- diff --git a/README.md b/README.md index 20a74e3..18044db 100644 --- a/README.md +++ b/README.md @@ -6,9 +6,12 @@ Syntax highlighting, matching rules and mappings for [the original Markdown](htt 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 @@ -69,13 +72,17 @@ The following work on normal and visual modes: ## Commands -- `:Toc`: create a quickfix vertical window navigable table of contents with the headers. +- `:HeaderDecrease`: - Hit `` 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`: @@ -83,17 +90,22 @@ The following work on normal and visual modes: 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 `` 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 diff --git a/ftplugin/mkd.vim b/ftplugin/mkd.vim index e177bd1..42dca90 100644 --- a/ftplugin/mkd.vim +++ b/ftplugin/mkd.vim @@ -47,12 +47,12 @@ " 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. @@ -302,27 +302,27 @@ function! s:Markdown_Toc(...) 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 @@ -392,10 +392,26 @@ function! s:HeaderDecrease(line1, line2, ...) 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 MapNormVis('(Markdown_MoveToNextHeader)', 'Markdown_MoveToNextHeader') call MapNormVis('(Markdown_MoveToPreviousHeader)', 'Markdown_MoveToPreviousHeader') call MapNormVis('(Markdown_MoveToNextSiblingHeader)', 'Markdown_MoveToNextSiblingHeader') @@ -421,10 +437,11 @@ if !get(g:, 'vim_markdown_no_default_key_mappings', 0) vmap ]c (Markdown_MoveToCurHeader) endif +command! -buffer -range=% HeaderDecrease call s:HeaderDecrease(, ) +command! -buffer -range=% HeaderIncrease call s:HeaderDecrease(, , 1) +command! -buffer -range=% SetexToAtx call s:SetexToAtx(, ) +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(, ) -command! -buffer -range=% HeaderDecrease call s:HeaderDecrease(, ) -command! -buffer -range=% HeaderIncrease call s:HeaderDecrease(, , 1) diff --git a/indent/mkd.vim b/indent/mkd.vim index a26ac0e..21b8397 100755 --- a/indent/mkd.vim +++ b/indent/mkd.vim @@ -10,7 +10,8 @@ setlocal autoindent 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) diff --git a/syntax/mkd.vim b/syntax/mkd.vim index e10bbc3..4677f65 100644 --- a/syntax/mkd.vim +++ b/syntax/mkd.vim @@ -124,6 +124,9 @@ setlocal formatoptions-=c " 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 diff --git a/test/header.md b/test/header.md new file mode 100644 index 0000000..7e19083 --- /dev/null +++ b/test/header.md @@ -0,0 +1,82 @@ +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 diff --git a/test/indent.md b/test/indent.md new file mode 100644 index 0000000..6d250a1 --- /dev/null +++ b/test/indent.md @@ -0,0 +1,26 @@ +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 diff --git a/test/multiple_headers.md b/test/multiple_headers.md deleted file mode 100644 index b6a403a..0000000 --- a/test/multiple_headers.md +++ /dev/null @@ -1,27 +0,0 @@ -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 diff --git a/test/table_format.md b/test/table_format.md new file mode 100644 index 0000000..3b617f0 --- /dev/null +++ b/test/table_format.md @@ -0,0 +1,17 @@ +| 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 ||