74 lines
2.7 KiB
VimL
74 lines
2.7 KiB
VimL
|
function s:TraverseBackwardsUntilFound(path, glob)
|
||
|
let cur_path = resolve(fnamemodify(a:path, ':p:h'))
|
||
|
while cur_path != "/"
|
||
|
let result = globpath(cur_path, a:glob)
|
||
|
if result != ""
|
||
|
return result
|
||
|
endif
|
||
|
let cur_path = resolve(cur_path.."/..")
|
||
|
endwhile
|
||
|
return ""
|
||
|
endfunction
|
||
|
|
||
|
function! ExecuteCurrentFile()
|
||
|
let file_wd = expand('%:p:h')
|
||
|
let file_name = expand('%:t')
|
||
|
echom "Running ".file_name
|
||
|
|
||
|
let lines = readfile(expand('%'))
|
||
|
let ndx = match(lines, "x-run: .*")
|
||
|
let makefile_path = s:TraverseBackwardsUntilFound(file_wd, "Makefile")
|
||
|
|
||
|
if ndx != -1
|
||
|
let cmd = matchstr(lines[ndx], "x-run: .*")[7:]
|
||
|
exec 'FloatermNew --autoclose=0 cd '.fnameescape(file_wd).'; '
|
||
|
\ . substitute(cmd, '%', fnameescape(file_name), '')
|
||
|
elseif &filetype == 'python'
|
||
|
exec 'FloatermNew --autoclose=0 cd '.fnameescape(file_wd).'; '
|
||
|
\ . 'python3 '.fnameescape(file_name)
|
||
|
elseif &filetype == 'lua'
|
||
|
exec 'FloatermNew --autoclose=0 cd '.fnameescape(file_wd).'; '
|
||
|
\ . 'lua '.fnameescape(file_name)
|
||
|
elseif &filetype == 'c'
|
||
|
let exec_name = expand('%:t:r')
|
||
|
exec 'FloatermNew --autoclose=0 cd ' . fnameescape(file_wd) . '; '
|
||
|
\ . 'cc -o '.fnameescape(exec_name).' '.fnameescape(file_name)
|
||
|
\ . ' -lm'
|
||
|
\ . ' && '
|
||
|
\ . 'exec '.fnameescape(exec_name)
|
||
|
elseif &filetype == 'rust'
|
||
|
let cargo_file = s:TraverseBackwardsUntilFound(file_wd, "Cargo.toml")
|
||
|
if cargo_file != ""
|
||
|
exec 'FloatermNew --autoclose=0 cd '.fnameescape(file_wd).'; cargo run'
|
||
|
else
|
||
|
let exec_name = expand('%:t:r')
|
||
|
exec 'FloatermNew --autoclose=0 cd ' . fnameescape(file_wd) . '; '
|
||
|
\ . 'rustc '.fnameescape(file_name)
|
||
|
\ . ' && '
|
||
|
\ . 'exec '.fnameescape(exec_name)
|
||
|
endif
|
||
|
elseif &filetype == 'vim'
|
||
|
exec 'source '.expand('%')
|
||
|
elseif &filetype == 'dot'
|
||
|
let img_name = expand('%:t:r') . ".png"
|
||
|
exec '! cd ' . fnameescape(file_wd) . '; '
|
||
|
\ . 'dot -Tpng '.fnameescape(file_name).' >'.fnameescape(img_name)
|
||
|
\ . ' && '
|
||
|
\ . 'sxiv '.fnameescape(img_name)
|
||
|
elseif &filetype == 'sh'
|
||
|
exec 'FloatermNew --autoclose=0 cd ' . fnameescape(file_wd) . '; '
|
||
|
\ . '/bin/bash ' . fnameescape(file_name)
|
||
|
elseif makefile_path != ""
|
||
|
let makefile_dir = fnamemodify(makefile_path, ":p:h")
|
||
|
exec 'FloatermNew --autoclose=0 cd '.fnameescape(makefile_dir).'; '
|
||
|
\ . 'make run'
|
||
|
else
|
||
|
echohl ErrorMsg
|
||
|
echom "Unknown file type: ".&filetype
|
||
|
echohl None
|
||
|
endif
|
||
|
endfunction
|
||
|
|
||
|
nnoremap <F12> :w<CR>:call ExecuteCurrentFile()<CR>
|
||
|
inoremap <F12> <ESC>:w<CR>:call ExecuteCurrentFile()<CR>a
|