]> 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 pull request #103 from fmoralesc/patch-1
authorCiro Santilli <ciro.santilli@gmail.com>
Sun, 7 Sep 2014 16:01:43 +0000 (18:01 +0200)
committerCiro Santilli <ciro.santilli@gmail.com>
Sun, 7 Sep 2014 16:01:43 +0000 (18:01 +0200)
Toc: Pass errors if no atx headers are processed.

README.md
ftplugin/mkd.vim
indent/mkd.vim
syntax/mkd.vim
test/header.md [new file with mode: 0644]
test/indent.md [new file with mode: 0644]
test/multiple_headers.md [deleted file]
test/table_format.md [new file with mode: 0644]

index 20a74e3806b319d7b2745c1edd9ae582c61e49f7..18044db9d042181c4871062592ec5f78936dfefa 100644 (file)
--- 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 `<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`:
 
@@ -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 `<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
 
index e177bd13c79f07ee8641fec69cc7c337444857cc..42dca901e1db36e153a1f75fc773ef912e84dca3 100644 (file)
 
 " 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 <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')
@@ -421,10 +437,11 @@ if !get(g:, 'vim_markdown_no_default_key_mappings', 0)
     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)
index a26ac0efdc88829d7ecc24021c42716d75b4a839..21b8397aca60a8d46c926a2d1914733160d4dedb 100755 (executable)
@@ -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)
index e10bbc33f5223a7fe5ff91e3fa33b59ce3bd7187..4677f6546f6b428b9d46fc6d6c5386fe9005ad01 100644 (file)
@@ -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 (file)
index 0000000..7e19083
--- /dev/null
@@ -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 (file)
index 0000000..6d250a1
--- /dev/null
@@ -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 (file)
index b6a403a..0000000
+++ /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 (file)
index 0000000..3b617f0
--- /dev/null
@@ -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  ||