From 96c5c20e418fa95b7137b6ef418946f25de91b1b Mon Sep 17 00:00:00 2001 From: Adam Stankiewicz Date: Tue, 6 Feb 2018 11:16:48 +0800 Subject: [PATCH] Include indentation setting for markdown, fixes #270 --- README.md | 2 +- build | 2 +- indent/markdown.vim | 79 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 81 insertions(+), 2 deletions(-) create mode 100644 indent/markdown.vim diff --git a/README.md b/README.md index 0b0d51bc2..0f2bf3255 100644 --- a/README.md +++ b/README.md @@ -97,7 +97,7 @@ If you need full functionality of any plugin, please use it directly with your p - [livescript](https://github.com/gkz/vim-ls) (syntax, indent, compiler, ftplugin) - [lua](https://github.com/tbastos/vim-lua) (syntax, indent) - [mako](https://github.com/sophacles/vim-bundle-mako) (syntax, indent, ftplugin) -- [markdown](https://github.com/plasticboy/vim-markdown) (syntax) +- [markdown](https://github.com/plasticboy/vim-markdown) (syntax, indent) - [mathematica](https://github.com/rsmenon/vim-mathematica) (syntax, ftplugin) - [nginx](https://github.com/chr4/nginx.vim) (syntax, indent, ftplugin) - [nim](https://github.com/zah/nim.vim) (syntax, compiler, indent) diff --git a/build b/build index 36668e028..42a121dba 100755 --- a/build +++ b/build @@ -5,7 +5,7 @@ set -E DIRS="syntax indent compiler autoload ftplugin after/syntax after/indent after/ftplugin" DIRS_BASIC="syntax compiler indent after/syntax after/indent" DIRS_ALL="syntax indent compiler autoload ftplugin after" -DIRS_SYNTAX="syntax after/syntax" +DIRS_SYNTAX="syntax indent after/syntax after/indent" DIRS_JAVASCRIPT="${DIRS} extras" DIRS_RM="$DIRS_JAVASCRIPT" diff --git a/indent/markdown.vim b/indent/markdown.vim new file mode 100644 index 000000000..fa2b460d8 --- /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