From cc9e6e4e3c275ce8d2bf4b0b192847d9b1cf2b1b Mon Sep 17 00:00:00 2001 From: Adnan Zafar Date: Fri, 23 Jan 2015 16:37:42 -0500 Subject: [PATCH] Indent $VISUAL expansions properly See #177 and #178 --- autoload/snipmate/parse.vim | 31 +++++++++++++++++++++++-------- t/parser.vim | 7 +++++++ 2 files changed, 30 insertions(+), 8 deletions(-) diff --git a/autoload/snipmate/parse.vim b/autoload/snipmate/parse.vim index d0d101f5..157cedf2 100644 --- a/autoload/snipmate/parse.vim +++ b/autoload/snipmate/parse.vim @@ -11,6 +11,7 @@ function! s:new_parser(text) let ret.input = a:text let ret.len = strlen(ret.input) let ret.pos = -1 + let ret.indent = 0 let ret.value = [] let ret.vars = {} call ret.advance() @@ -123,9 +124,11 @@ function! s:parser_text(...) dict elseif self.next == "\n" call add(res, val) let val = '' + let self.indent = 0 call self.advance() - elseif self.next == "\t" && &expandtab - let val .= repeat(' ', (&sts > 0) ? &sts : &sw) + elseif self.next == "\t" + let self.indent += 1 + let val .= s:indent(1) call self.advance() else let val .= self.next @@ -144,12 +147,13 @@ function! s:parser_parse(...) dict let var = self.var() if !empty(var) if var[0] is# 'VISUAL' - let add_to = s:visual_placeholder(var) + let add_to = s:visual_placeholder(var, self.indent) if !empty(ret) && type(ret[-1]) == type('') - let ret[-1] .= add_to + let ret[-1] .= add_to[0] else - call add(ret, add_to) + call add(ret, add_to[0]) endif + call extend(ret, add_to[1:-1]) elseif var[0] >= 0 call add(ret, var) call self.add_var(var) @@ -182,13 +186,24 @@ call extend(s:parser_proto, snipmate#util#add_methods(s:sfile(), 'parser', \ [ 'advance', 'same', 'id', 'add_var', 'var', 'varend', \ 'placeholder', 'subst', 'expr', 'text', 'parse' ]), 'error') -function! s:visual_placeholder(var) +function! s:indent(count) + if &expandtab + let shift = repeat(' ', (&sts > 0) ? &sts : &sw) + else + let shift = "\t" + endif + return repeat(shift, a:count) +endfunction + +function! s:visual_placeholder(var, indent) let dict = get(a:var, 1, {}) let pat = get(dict, 'pat', '') let sub = get(dict, 'sub', '') let flags = get(dict, 'flags', '') - let ret = substitute(get(b:, 'snipmate_visual', ''), pat, sub, flags) - return ret + let content = split(substitute(get(b:, 'snipmate_visual', ''), pat, sub, flags), "\n", 1) + let indent = s:indent(a:indent) + call map(content, '(v:key != 0) ? indent . v:val : v:val') + return content endfunction function! snipmate#parse#snippet(text) diff --git a/t/parser.vim b/t/parser.vim index 416be2fb..4b1ecce1 100644 --- a/t/parser.vim +++ b/t/parser.vim @@ -104,4 +104,11 @@ describe 'snippet parser' Expect Parse("x\n$1x") == ['x', '', [1], 'x'] end + it 'expands $VISUAL placeholders with any indents' + Expect Parse("x$VISUALx") == ['xtestvisualx'] + let b:snipmate_visual = " foo\nbar\n baz" + setl noet + Expect Parse("\tx\n\t$VISUAL\nx") == ["\tx", "\t foo", "\tbar", "\t baz", "x"] + end + end