52 lines
1.3 KiB
VimL
52 lines
1.3 KiB
VimL
function! go#fillstruct#FillStruct() abort
|
|
let l:cmd = ['fillstruct',
|
|
\ '-file', bufname(''),
|
|
\ '-offset', go#util#OffsetCursor()]
|
|
|
|
" Read from stdin if modified.
|
|
if &modified
|
|
call add(l:cmd, '-modified')
|
|
let [l:out, l:err] = go#util#Exec(l:cmd, go#util#archive())
|
|
else
|
|
let [l:out, l:err] = go#util#Exec(l:cmd)
|
|
endif
|
|
|
|
if l:err
|
|
call go#util#EchoError(l:out)
|
|
return
|
|
endif
|
|
|
|
try
|
|
let l:json = json_decode(l:out)
|
|
catch
|
|
call go#util#EchoError(l:out)
|
|
return
|
|
endtry
|
|
|
|
let l:code = split(l:json['code'], "\n")
|
|
let l:pos = getpos('.')
|
|
|
|
try
|
|
" Add any code before/after the struct.
|
|
exe l:json['start'] . 'go'
|
|
let l:code[0] = getline('.')[:col('.')-1] . l:code[0]
|
|
exe l:json['end'] . 'go'
|
|
let l:code[len(l:code)-1] .= getline('.')[col('.'):]
|
|
|
|
" Indent every line except the first one; makes it look nice.
|
|
let l:indent = repeat("\t", indent('.') / &ts)
|
|
for i in range(1, len(l:code)-1)
|
|
let l:code[l:i] = l:indent . l:code[i]
|
|
endfor
|
|
|
|
" Out with the old ...
|
|
exe 'normal! ' . l:json['start'] . 'gov' . l:json['end'] . 'gox'
|
|
" ... in with the new.
|
|
call setline('.', l:code[0])
|
|
call append('.', l:code[1:])
|
|
finally
|
|
call setpos('.', l:pos)
|
|
endtry
|
|
endfunction
|
|
|
|
" vim: sw=2 ts=2 et
|