summaryrefslogtreecommitdiffstats
path: root/autoload/cargo.vim
diff options
context:
space:
mode:
Diffstat (limited to 'autoload/cargo.vim')
-rw-r--r--autoload/cargo.vim116
1 files changed, 59 insertions, 57 deletions
diff --git a/autoload/cargo.vim b/autoload/cargo.vim
index e92da22b..d1547fc9 100644
--- a/autoload/cargo.vim
+++ b/autoload/cargo.vim
@@ -1,89 +1,91 @@
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'rust') == -1
+function! cargo#Load()
+ " Utility call to get this script loaded, for debugging
+endfunction
+
function! cargo#cmd(args)
- silent! clear
- if !a:args
- execute "!" . "cargo ". a:args
+ execute "! cargo" a:args
+endfunction
+
+function! s:nearest_cargo(...) abort
+ " If the second argument is not specified, the first argument determines
+ " whether we will start from the current directory or the directory of the
+ " current buffer, otherwise, we start with the provided path on the
+ " second argument.
+
+ let l:is_getcwd = get(a:, 1, 0)
+ if l:is_getcwd
+ let l:starting_path = get(a:, 2, getcwd())
else
- echom "Missing arguments"
+ let l:starting_path = get(a:, 2, expand('%:p:h'))
endif
+
+ return findfile('Cargo.toml', l:starting_path . ';')
endfunction
-function! cargo#build(args)
- silent! clear
- if !a:args
- execute "!" . "cargo build " . a:args
- else
- execute "!" . "cargo build"
+function! cargo#nearestCargo(is_getcwd) abort
+ return s:nearest_cargo(a:is_getcwd)
+endfunction
+
+function! cargo#nearestWorkspaceCargo(is_getcwd) abort
+ let l:nearest = s:nearest_cargo(a:is_getcwd)
+ while l:nearest !=# ''
+ for l:line in readfile(l:nearest, '', 0x100)
+ if l:line =~# '\V[workspace]'
+ return l:nearest
+ endif
+ endfor
+ let l:next = fnamemodify(l:nearest, ':p:h:h')
+ let l:nearest = s:nearest_cargo(0, l:next)
+ endwhile
+ return ''
+endfunction
+
+function! cargo#nearestRootCargo(is_getcwd) abort
+ " Try to find a workspace Cargo.toml, and if not found, take the nearest
+ " regular Cargo.toml
+ let l:workspace_cargo = cargo#nearestWorkspaceCargo(a:is_getcwd)
+ if l:workspace_cargo !=# ''
+ return l:workspace_cargo
endif
- silent! clear
- execute "!" . "cargo build"
+ return s:nearest_cargo(a:is_getcwd)
+endfunction
+
+
+function! cargo#build(args)
+ call cargo#cmd("build " . a:args)
endfunction
function! cargo#clean(args)
- silent! clear
- if !a:args
- execute "!" . "cargo clean " . a:args
- else
- execute "!" . "cargo clean"
- endif
- silent! clear
- execute "!" . "cargo clean"
+ call cargo#cmd("clean " . a:args)
endfunction
function! cargo#doc(args)
- silent! clear
- if !a:args
- execute "!" . "cargo doc " . a:args
- else
- execute "!" . "cargo doc"
- endif
+ call cargo#cmd("doc " . a:args)
endfunction
function! cargo#new(args)
- silent! clear
- if !a:args
- execute "!cargo new " . a:args
- :cd `=a:args`
- else
- echom "Missing arguments"
- endif
+ call cargo#cmd("new " . a:args)
+ cd `=a:args`
endfunction
function! cargo#init(args)
- silent! clear
- if !a:args
- execute "!" . "cargo init " . a:args
- else
- execute "!" . "cargo init"
- endif
+ call cargo#cmd("init " . a:args)
endfunction
function! cargo#run(args)
- silent! clear
- if !a:args
- execute "!" . "cargo run " . a:args
- else
- execute "!" . "cargo run"
- endif
+ call cargo#cmd("run " . a:args)
endfunction
function! cargo#test(args)
- silent! clear
- if !a:args
- execute "!" . "cargo test " . a:args
- else
- execute "!" . "cargo test"
- endif
+ call cargo#cmd("test " . a:args)
endfunction
function! cargo#bench(args)
- silent! clear
- if !a:args
- execute "!" . "cargo bench " . a:args
- else
- execute "!" . "cargo bench"
- endif
+ call cargo#cmd("bench " . a:args)
endfunction
+" vim: set et sw=4 sts=4 ts=8:
+
endif