mirror of
https://github.com/neovim/neovim.git
synced 2024-12-20 19:25:11 -07:00
3576776903
Update runtime files86b4816766
vim-patch:9.0.1029: autoload directory missing from distribution Problem: Autoload directory missing from distribution. Solution: Add the autoload/zig directory to the list of distributed files.84dbf855fb
Co-authored-by: Bram Moolenaar <Bram@vim.org>
101 lines
2.8 KiB
VimL
101 lines
2.8 KiB
VimL
" Adapted from fatih/vim-go: autoload/go/fmt.vim
|
|
"
|
|
" Copyright 2011 The Go Authors. All rights reserved.
|
|
" Use of this source code is governed by a BSD-style
|
|
" license that can be found in the LICENSE file.
|
|
"
|
|
" Upstream: https://github.com/ziglang/zig.vim
|
|
|
|
function! zig#fmt#Format() abort
|
|
" Save cursor position and many other things.
|
|
let view = winsaveview()
|
|
|
|
if !executable('zig')
|
|
echohl Error | echomsg "no zig binary found in PATH" | echohl None
|
|
return
|
|
endif
|
|
|
|
let cmdline = 'zig fmt --stdin --ast-check'
|
|
let current_buf = bufnr('')
|
|
|
|
" The formatted code is output on stdout, the errors go on stderr.
|
|
if exists('*systemlist')
|
|
silent let out = systemlist(cmdline, current_buf)
|
|
else
|
|
silent let out = split(system(cmdline, current_buf))
|
|
endif
|
|
if len(out) == 1
|
|
if out[0] == "error: unrecognized parameter: '--ast-check'"
|
|
let cmdline = 'zig fmt --stdin'
|
|
if exists('*systemlist')
|
|
silent let out = systemlist(cmdline, current_buf)
|
|
else
|
|
silent let out = split(system(cmdline, current_buf))
|
|
endif
|
|
endif
|
|
endif
|
|
let err = v:shell_error
|
|
|
|
|
|
if err == 0
|
|
" remove undo point caused via BufWritePre.
|
|
try | silent undojoin | catch | endtry
|
|
|
|
" Replace the file content with the formatted version.
|
|
if exists('*deletebufline')
|
|
call deletebufline(current_buf, len(out), line('$'))
|
|
else
|
|
silent execute ':' . len(out) . ',' . line('$') . ' delete _'
|
|
endif
|
|
call setline(1, out)
|
|
|
|
" No errors detected, close the loclist.
|
|
call setloclist(0, [], 'r')
|
|
lclose
|
|
elseif get(g:, 'zig_fmt_parse_errors', 1)
|
|
let errors = s:parse_errors(expand('%'), out)
|
|
|
|
call setloclist(0, [], 'r', {
|
|
\ 'title': 'Errors',
|
|
\ 'items': errors,
|
|
\ })
|
|
|
|
let max_win_height = get(g:, 'zig_fmt_max_window_height', 5)
|
|
" Prevent the loclist from becoming too long.
|
|
let win_height = min([max_win_height, len(errors)])
|
|
" Open the loclist, but only if there's at least one error to show.
|
|
execute 'silent! lwindow ' . win_height
|
|
endif
|
|
|
|
call winrestview(view)
|
|
|
|
if err != 0
|
|
echohl Error | echomsg "zig fmt returned error" | echohl None
|
|
return
|
|
endif
|
|
|
|
" Run the syntax highlighter on the updated content and recompute the folds if
|
|
" needed.
|
|
syntax sync fromstart
|
|
endfunction
|
|
|
|
" parse_errors parses the given errors and returns a list of parsed errors
|
|
function! s:parse_errors(filename, lines) abort
|
|
" list of errors to be put into location list
|
|
let errors = []
|
|
for line in a:lines
|
|
let tokens = matchlist(line, '^\(.\{-}\):\(\d\+\):\(\d\+\)\s*\(.*\)')
|
|
if !empty(tokens)
|
|
call add(errors,{
|
|
\"filename": a:filename,
|
|
\"lnum": tokens[2],
|
|
\"col": tokens[3],
|
|
\"text": tokens[4],
|
|
\ })
|
|
endif
|
|
endfor
|
|
|
|
return errors
|
|
endfunction
|
|
" vim: sw=2 ts=2 et
|