diff --git a/misc/vim/ftplugin/go/fmt.vim b/misc/vim/ftplugin/go/fmt.vim index a299dfcee7d..0ee44cd59ef 100644 --- a/misc/vim/ftplugin/go/fmt.vim +++ b/misc/vim/ftplugin/go/fmt.vim @@ -17,12 +17,26 @@ command! -buffer Fmt call s:GoFormat() function! s:GoFormat() let view = winsaveview() - %!gofmt + silent %!gofmt if v:shell_error - %| " output errors returned by gofmt - " TODO(dchest): perhaps, errors should go to quickfix + let errors = [] + for line in getline(1, line('$')) + let tokens = matchlist(line, '^\(.\{-}\):\(\d\+\):\(\d\+\)\s*\(.*\)') + if !empty(tokens) + call add(errors, {"filename": @%, + \"lnum": tokens[2], + \"col": tokens[3], + \"text": tokens[4]}) + endif + endfor + if empty(errors) + % | " Couldn't detect gofmt error format, output errors + endif undo - echohl Error | echomsg "Gofmt returned error" | echohl None + if !empty(errors) + call setloclist(0, errors, 'r') + endif + echohl Error | echomsg "Gofmt returned error" | echohl None endif call winrestview(view) endfunction