Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
From rust-lang/rust.vim@732b5fc Some modifications as per #1356 that will be folded back upstream.
- Loading branch information
1 parent
0cdb72a
commit 82afe63
Showing
8 changed files
with
1,534 additions
and
0 deletions.
There are no files selected for viewing
Large diffs are not rendered by default.
Oops, something went wrong.
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,107 @@ | ||
" Author: Stephen Sugden <stephen@stephensugden.com> | ||
" | ||
" Adapted from https://github.com/fatih/vim-go | ||
" For bugs, patches and license go to https://github.com/rust-lang/rust.vim | ||
|
||
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! s:RustfmtCommandRange(filename, line1, line2) | ||
let l:arg = {"file": shellescape(a:filename), "range": [a:line1, a:line2]} | ||
return printf("%s %s --write-mode=overwrite --file-lines '[%s]'", g:rustfmt_command, g:rustfmt_options, json_encode(l:arg)) | ||
endfunction | ||
|
||
function! s:RustfmtCommand(filename) | ||
return g:rustfmt_command . " --write-mode=overwrite " . g:rustfmt_options . " " . shellescape(a:filename) | ||
endfunction | ||
|
||
function! s:RunRustfmt(command, curw, tmpname) | ||
if exists("*systemlist") | ||
let out = systemlist(a:command) | ||
else | ||
let out = split(system(a:command), '\r\?\n') | ||
endif | ||
|
||
if v:shell_error == 0 || v:shell_error == 3 | ||
" remove undo point caused via BufWritePre | ||
try | silent undojoin | catch | endtry | ||
|
||
" Replace current file with temp file, then reload buffer | ||
call rename(a: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(a:tmpname) | ||
endif | ||
|
||
call winrestview(a:curw) | ||
endfunction | ||
|
||
function! rustfmt#FormatRange(line1, line2) | ||
let l:curw = winsaveview() | ||
let l:tmpname = expand("%:p:h") . "/." . expand("%:p:t") . ".rustfmt" | ||
call writefile(getline(1, '$'), l:tmpname) | ||
|
||
let command = s:RustfmtCommandRange(l:tmpname, a:line1, a:line2) | ||
|
||
call s:RunRustfmt(command, l:curw, l:tmpname) | ||
endfunction | ||
|
||
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 = s:RustfmtCommand(l:tmpname) | ||
|
||
call s:RunRustfmt(command, l:curw, l:tmpname) | ||
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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,29 @@ | ||
" Vim compiler file | ||
" Compiler: Cargo Compiler | ||
" Maintainer: Damien Radtke <damienradtke@gmail.com> | ||
" Latest Revision: 2014 Sep 24 | ||
" For bugs, patches and license go to https://github.com/rust-lang/rust.vim | ||
|
||
if exists('current_compiler') | ||
finish | ||
endif | ||
runtime compiler/rustc.vim | ||
let current_compiler = "cargo" | ||
|
||
if exists(':CompilerSet') != 2 | ||
command -nargs=* CompilerSet setlocal <args> | ||
endif | ||
|
||
if exists('g:cargo_makeprg_params') | ||
execute 'CompilerSet makeprg=cargo\ '.escape(g:cargo_makeprg_params, ' \|"').'\ $*' | ||
else | ||
CompilerSet makeprg=cargo\ $* | ||
endif | ||
|
||
" Ignore general cargo progress messages | ||
CompilerSet errorformat+= | ||
\%-G%\\s%#Downloading%.%#, | ||
\%-G%\\s%#Compiling%.%#, | ||
\%-G%\\s%#Finished%.%#, | ||
\%-G%\\s%#error:\ Could\ not\ compile\ %.%#, | ||
\%-G%\\s%#To\ learn\ more\\,%.%# |
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,46 @@ | ||
" Vim compiler file | ||
" Compiler: Rust Compiler | ||
" Maintainer: Chris Morgan <me@chrismorgan.info> | ||
" Latest Revision: 2013 Jul 12 | ||
" For bugs, patches and license go to https://github.com/rust-lang/rust.vim | ||
|
||
if exists("current_compiler") | ||
finish | ||
endif | ||
let current_compiler = "rustc" | ||
|
||
let s:cpo_save = &cpo | ||
set cpo&vim | ||
|
||
if exists(":CompilerSet") != 2 | ||
command -nargs=* CompilerSet setlocal <args> | ||
endif | ||
|
||
if exists("g:rustc_makeprg_no_percent") && g:rustc_makeprg_no_percent != 0 | ||
CompilerSet makeprg=rustc | ||
else | ||
CompilerSet makeprg=rustc\ \% | ||
endif | ||
|
||
" Old errorformat (before nightly 2016/08/10) | ||
CompilerSet errorformat= | ||
\%f:%l:%c:\ %t%*[^:]:\ %m, | ||
\%f:%l:%c:\ %*\\d:%*\\d\ %t%*[^:]:\ %m, | ||
\%-G%f:%l\ %s, | ||
\%-G%*[\ ]^, | ||
\%-G%*[\ ]^%*[~], | ||
\%-G%*[\ ]... | ||
|
||
" New errorformat (after nightly 2016/08/10) | ||
CompilerSet errorformat+= | ||
\%-G, | ||
\%-Gerror:\ aborting\ %.%#, | ||
\%-Gerror:\ Could\ not\ compile\ %.%#, | ||
\%Eerror:\ %m, | ||
\%Eerror[E%n]:\ %m, | ||
\%Wwarning:\ %m, | ||
\%Inote:\ %m, | ||
\%C\ %#-->\ %f:%l:%c | ||
|
||
let &cpo = s:cpo_save | ||
unlet s:cpo_save |
Oops, something went wrong.