dot_files/vim-plugins/bundle/xptemplate/autoload/xpt/indent.vim
2017-07-09 00:26:06 +03:00

85 lines
2.7 KiB
VimL

exec xpt#once#init
let s:oldcpo = &cpo
set cpo-=< cpo+=B
let s:log = xpt#debug#Logger( 'warn' )
exe XPT#importConst
let s:indent_convert_cmd = 'substitute(v:val, ''\v(^\s*)@<= '', '' '', "g" )'
fun! xpt#indent#ParseStr(text,first_line_shift)
let text = xpt#indent#IndentToTabStr(a:text)
return xpt#indent#ToActualIndentStr(text,a:first_line_shift)
endfunction
fun! xpt#indent#IndentToTabStr(text)
let lines = split( a:text, '\n', 1 )
call xpt#indent#IndentToTab(lines)
return join(lines, "\n")
endfunction
fun! xpt#indent#ToActualIndentStr(text,first_line_shift)
let lines = split( a:text, '\n', 1 )
call xpt#indent#ToActualIndent(lines,a:first_line_shift)
return join(lines, "\n")
endfunction
fun! xpt#indent#IndentToTab(lines)
call map(a:lines,s:indent_convert_cmd)
endfunction
fun! xpt#indent#ToActualIndent(lines,first_line_shift)
let indent_spaces = repeat(' ', &shiftwidth)
let cmd = 'substitute(v:val, ''\v(^ *)@<= '', ''' . indent_spaces . ''', "g" )'
call map(a:lines,cmd)
if a:first_line_shift != 0
let shift_spaces = repeat(' ', a:first_line_shift)
let i = 1
while i < len(a:lines)
if a:lines[i] != '' || i == len(a:lines)-1
let a:lines[i] = shift_spaces . a:lines[i]
endif
let i += 1
endwhile
endif
if &expandtab
return
endif
let tabspaces = repeat( ' ', &tabstop )
let cmd = 'substitute(v:val, ''\v(^\s*)@<=' . tabspaces . ''', '' '', "g" )'
call map(a:lines,cmd)
endfunction
fun! xpt#indent#IndentBefore(pos)
let [ln,col] = a:pos
let line = matchstr( getline(ln), '\V\^\s\*' )
let line = ( col == 1 ) ? '' : line[ 0 : col - 1 - 1 ]
let tabspaces = repeat( ' ', &tabstop )
return len( substitute( line, ' ', tabspaces, 'g' ) )
endfunction
fun! xpt#indent#RemoveIndentStr(text,nIndent)
let reg = '\V\n \{,' . a:nIndent . '\}'
let text = substitute(a:text, reg, '\n', 'g')
return text
endfunction
fun! xpt#indent#ToSpace(text)
if stridx( a:text, " " ) < 0
return a:text
endif
let tabspaces = repeat( ' ', &tabstop )
let reg = '\v' . tabspaces . '| {0,' . (&tabstop-1) . '} '
let rst = []
let lines = split( a:text, '\n', 1 )
for line in lines
let leading_space = matchstr( line, '\v\s*' )
let left = line[len(leading_space) :]
let l = substitute( leading_space, reg, tabspaces, 'g' )
call add(rst,l . left)
endfor
return join(rst, "\n")
endfunction
fun! xpt#indent#SpaceToTab(text)
let indent_spaces = repeat(' ', &shiftwidth)
let reg = 'substitute(v:val, ''\v(^\s*)@<='.indent_spaces.''', " ", "g" )'
let lines = split( a:text, '\n', 1 )
call map(lines,reg)
return join(lines, "\n")
endfunction
fun! xpt#indent#ActualToSnippetNr(n)
let n_one_indent = &shiftwidth
let n_indent = a:n / n_one_indent
return n_indent * 4 + a:n % n_one_indent
endfunction
let &cpo = s:oldcpo