diff options
Diffstat (limited to '')
| -rw-r--r-- | indent/markdown.vim | 79 | 
1 files changed, 79 insertions, 0 deletions
| diff --git a/indent/markdown.vim b/indent/markdown.vim new file mode 100644 index 00000000..fa2b460d --- /dev/null +++ b/indent/markdown.vim @@ -0,0 +1,79 @@ +if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'markdown') == -1 +   +if exists("b:did_indent") | finish | endif +let b:did_indent = 1 + +setlocal indentexpr=GetMarkdownIndent() +setlocal nolisp +setlocal autoindent + +" Automatically insert bullets +setlocal formatoptions+=r +" Do not automatically insert bullets when auto-wrapping with text-width +setlocal formatoptions-=c +" Accept various markers as bullets +setlocal comments=b:*,b:+,b:- + +" Automatically continue blockquote on line break +setlocal comments+=b:> + +" Only define the function once +if exists("*GetMarkdownIndent") | finish | endif + +function! s:IsMkdCode(lnum) +    let name = synIDattr(synID(a:lnum, 1, 0), 'name') +    return (name =~ '^mkd\%(Code$\|Snippet\)' || name != '' && name !~ '^\%(mkd\|html\)') +endfunction + +function! s:IsLiStart(line) +    return a:line !~ '^ *\([*-]\)\%( *\1\)\{2}\%( \|\1\)*$' && +      \    a:line =~ '^\s*[*+-] \+' +endfunction + +function! s:IsHeaderLine(line) +    return a:line =~ '^\s*#' +endfunction + +function! s:IsBlankLine(line) +    return a:line =~ '^$' +endfunction + +function! s:PrevNonBlank(lnum) +    let i = a:lnum +    while i > 1 && s:IsBlankLine(getline(i)) +        let i -= 1 +    endwhile +    return i +endfunction + +function GetMarkdownIndent() +    if v:lnum > 2 && s:IsBlankLine(getline(v:lnum - 1)) && s:IsBlankLine(getline(v:lnum - 2)) +        return 0 +    endif +    let list_ind = get(g:, "vim_markdown_new_list_item_indent", 4) +    " Find a non-blank line above the current line. +    let lnum = s:PrevNonBlank(v:lnum - 1) +    " At the start of the file use zero indent. +    if lnum == 0 | return 0 | endif +    let ind = indent(lnum) +    let line = getline(lnum)    " Last line +    let cline = getline(v:lnum) " Current line +    if s:IsLiStart(cline) +        " Current line is the first line of a list item, do not change indent +        return indent(v:lnum) +    elseif s:IsHeaderLine(cline) && !s:IsMkdCode(v:lnum) +        " Current line is the header, do not indent +        return 0 +    elseif s:IsLiStart(line) +        if s:IsMkdCode(lnum) +            return ind +        else +            " Last line is the first line of a list item, increase indent +            return ind + list_ind +        end +    else +        return ind +    endif +endfunction + +endif | 
