85 lines
2.7 KiB
VimL
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
|