-
Notifications
You must be signed in to change notification settings - Fork 292
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #52 from IanConnolly/feature/rustfmt
Integrate with rustfmt
- Loading branch information
Showing
5 changed files
with
137 additions
and
3 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,79 @@ | ||
" Author: Stephen Sugden <stephen@stephensugden.com> | ||
" | ||
" Adapted from https://github.com/fatih/vim-go | ||
|
||
if !exists("g:rustfmt_autosave") | ||
let g:rustfmt_autosave = 0 | ||
endif | ||
|
||
if !exists("g:rustfmt_command") | ||
let g:rustfmt_command = "rustfmt" | ||
endif | ||
|
||
if !exists("g:rustfmt_options") | ||
let g:rustfmt_options = "" | ||
endif | ||
|
||
if !exists("g:rustfmt_fail_silently") | ||
let g:rustfmt_fail_silently = 0 | ||
endif | ||
|
||
let s:got_fmt_error = 0 | ||
|
||
function! rustfmt#Format() | ||
let l:curw = winsaveview() | ||
let l:tmpname = expand("%:p:h") . "/." . expand("%:p:t") . ".rustfmt" | ||
call writefile(getline(1, '$'), l:tmpname) | ||
|
||
let command = g:rustfmt_command . " --write-mode=overwrite " | ||
|
||
let out = systemlist(command . g:rustfmt_options . " " . shellescape(l:tmpname)) | ||
|
||
if v:shell_error == 0 | ||
" remove undo point caused via BufWritePre | ||
try | silent undojoin | catch | endtry | ||
|
||
" Replace current file with temp file, then reload buffer | ||
call rename(l:tmpname, expand('%')) | ||
silent edit! | ||
let &syntax = &syntax | ||
|
||
" only clear location list if it was previously filled to prevent | ||
" clobbering other additions | ||
if s:got_fmt_error | ||
let s:got_fmt_error = 0 | ||
call setloclist(0, []) | ||
lwindow | ||
endif | ||
elseif g:rustfmt_fail_silently == 0 | ||
" otherwise get the errors and put them in the location list | ||
let errors = [] | ||
|
||
for line in out | ||
" src/lib.rs:13:5: 13:10 error: expected `,`, or `}`, found `value` | ||
let tokens = matchlist(line, '^\(.\{-}\):\(\d\+\):\(\d\+\):\s*\(\d\+:\d\+\s*\)\?\s*error: \(.*\)') | ||
if !empty(tokens) | ||
call add(errors, {"filename": @%, | ||
\"lnum": tokens[2], | ||
\"col": tokens[3], | ||
\"text": tokens[5]}) | ||
endif | ||
endfor | ||
|
||
if empty(errors) | ||
% | " Couldn't detect rustfmt error format, output errors | ||
endif | ||
|
||
if !empty(errors) | ||
call setloclist(0, errors, 'r') | ||
echohl Error | echomsg "rustfmt returned error" | echohl None | ||
endif | ||
|
||
let s:got_fmt_error = 1 | ||
lwindow | ||
" We didn't use the temp file, so clean up | ||
call delete(l:tmpname) | ||
endif | ||
|
||
call winrestview(l:curw) | ||
endfunction |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,8 @@ | ||
augroup rustfmt | ||
autocmd! | ||
|
||
" code formatting on save | ||
if get(g:, "rustfmt_autosave", 0) | ||
autocmd BufWritePre *.rs call rustfmt#Format() | ||
endif | ||
augroup END |