205 lines
4.1 KiB
VimL
Executable File
205 lines
4.1 KiB
VimL
Executable File
" {{{1
|
|
" Functions to compile and link a single c/cpp file.
|
|
"
|
|
" let g:cf5output
|
|
" =0 - no output window opened.
|
|
" =1 - ouput window opened.
|
|
"
|
|
"if exists("g:loaded_vahagn_compiler") | finish | endif
|
|
let g:loaded_vahagn_compiler = 1
|
|
|
|
"
|
|
" Make sure let-modeline.vim is loaded.
|
|
"
|
|
if !exists('*FirstModeLine')
|
|
runtime plugin/let-modeline.vim
|
|
endif
|
|
|
|
"
|
|
" Windows {{{1
|
|
"
|
|
function! s:CompileMSVC(run) "{{{2
|
|
let exename=expand("%:p:r:s,$,.exe,")
|
|
let srcname=expand("%")
|
|
" compile it
|
|
let ccline="cl ".g:cppflags." ".g:wcppflags." ".srcname." /Fe".exename." /link ".g:ldflags. " ".g:wldflags
|
|
echo ccline
|
|
let cout = system( ccline )
|
|
if v:shell_error
|
|
echo cout
|
|
return
|
|
endif
|
|
echo cout
|
|
" run it
|
|
if a:run==1
|
|
let cmdline="\"set PATH=".g:ldlibpath.$PATH." && ".exename." ".g:argv."\""
|
|
echo exename." ".g:argv
|
|
"echo cmdline
|
|
let eout = system( cmdline )
|
|
echo eout
|
|
endif
|
|
endfunction
|
|
|
|
function! s:CompileJava(run) "{{{2
|
|
" compile it
|
|
let cmd = "javac " . g:javaflags . " " . expand("%")
|
|
echo cmd
|
|
let cout = system( cmd )
|
|
echo cout
|
|
if v:shell_error
|
|
return
|
|
endif
|
|
" run it
|
|
"let classpath=expand("%:p:r")
|
|
let exename=expand("%:r")
|
|
let cmd = "java " . exename . " " . g:argv
|
|
echo cmd
|
|
let eout = system( cmd )
|
|
echo eout
|
|
endfunction
|
|
|
|
function! s:CompileWindows(run) "{{{2
|
|
let ext=expand("%:e")
|
|
if ext=="java"
|
|
call s:CompileJava(a:run)
|
|
endif
|
|
if ext=="cpp"
|
|
call s:CompileMSVC(a:run)
|
|
endif
|
|
endfunction
|
|
|
|
"
|
|
" Linux {{{1
|
|
"
|
|
function! s:CompileGCC(run) "{{{2
|
|
let exename=expand("%:p:r:s,$,.exe,")
|
|
let srcname=expand("%")
|
|
" compile it
|
|
let ccline="g++ ".g:cppflags." ".g:lcppflags." ".g:ldflags." ".srcname." -o".exename
|
|
call s:appendOutput(ccline)
|
|
let cout = system( ccline )
|
|
if v:shell_error
|
|
call s:appendOutput(cout)
|
|
return
|
|
endif
|
|
call s:appendOutput(cout)
|
|
" run it
|
|
if a:run == 1
|
|
let cmdline="LD_LIBRARY_PATH=".g:ldlibpath.":".$LD_LIBRARY_PATH." ".exename." ".g:argv
|
|
call s:appendOutput(cmdline)
|
|
let eout = system( cmdline )
|
|
call s:appendOutput(eout)
|
|
endif
|
|
endfunction
|
|
|
|
function! s:CompileLinux(run) "{{{2
|
|
call s:CompileGCC(a:run)
|
|
endfunction
|
|
|
|
"
|
|
" Output Window {{{1
|
|
"
|
|
" Create output window. {{{2
|
|
"
|
|
function! s:getOutputWindow()
|
|
if !exists("w:outputwin")
|
|
let w:outputwin=tempname().'_output'
|
|
endif
|
|
let obuff = w:outputwin
|
|
|
|
let winnr = bufwinnr('^'.obuff.'$')
|
|
|
|
if (winnr < 0)
|
|
execute "below 10new ".obuff
|
|
setlocal buftype=nofile bufhidden=wipe nobuflisted noswapfile nowrap
|
|
" setlocal nomodifiable
|
|
let winnr = bufwinnr('^'.obuff.'$')
|
|
endif
|
|
|
|
return winnr
|
|
endfunction
|
|
"
|
|
" Append text to output window. {{{2
|
|
"
|
|
function! s:appendOutput( text )
|
|
if exists("g:cf5output") && (g:cf5output==1)
|
|
let cwinnr = winnr()
|
|
let owinnr = s:getOutputWindow()
|
|
" setlocal modifiable
|
|
execute owinnr . 'wincmd w'
|
|
execute 'normal! Go'.a:text
|
|
" setlocal nomodifiable
|
|
execute cwinnr.'wincmd w'
|
|
else
|
|
echo a:text
|
|
endif
|
|
endfunction
|
|
"
|
|
" Clear text from output window. {{{2
|
|
"
|
|
function! s:clearOutputWindow()
|
|
if exists("g:cf5output") && (g:cf5output==1)
|
|
let cwinnr = winnr()
|
|
let owinnr = s:getOutputWindow()
|
|
" setlocal modifiable
|
|
execute owinnr . 'wincmd w'
|
|
execute 'normal ggdG'
|
|
" setlocal nomodifiable
|
|
execute cwinnr . 'wincmd w'
|
|
endif
|
|
endfunction
|
|
"
|
|
" Init global variables with default values. {{{1
|
|
"
|
|
function! s:initDefaults()
|
|
let g:cf5output=0
|
|
let g:argv=""
|
|
let g:cppflags=""
|
|
let g:wcppflags="/O2 /EHsc /DWIN32"
|
|
let g:lcppflags="-O2"
|
|
let g:ldflags=""
|
|
let g:wldflags=""
|
|
let g:ldlibpath=""
|
|
let g:cf5run=false
|
|
endfunction
|
|
"
|
|
" Load compile instructions and call window or linux compiler. {{{1
|
|
"
|
|
function! CF5Compile(run)
|
|
if &modified == 1
|
|
echo "The buffer is not saved. First save it."
|
|
return
|
|
endif
|
|
"
|
|
" First init global variables to let cf5-opt override it.
|
|
"
|
|
call s:initDefaults()
|
|
"
|
|
" Source compile-opt.vim if exists.
|
|
"
|
|
verbose let l:copt=expand("%:p:h")."/cf5-opt.vim"
|
|
if filereadable(l:copt)
|
|
exec ":source ".l:copt
|
|
endif
|
|
"
|
|
" Set source specific compiler options.
|
|
"
|
|
call FirstModeLine()
|
|
"if exists("g:cf5script")
|
|
" execute g:cf5script
|
|
"endif
|
|
"
|
|
" Clear output window
|
|
"
|
|
call s:clearOutputWindow()
|
|
"
|
|
" Compile.
|
|
"
|
|
if has("win32") || has("win64")
|
|
call s:CompileWindows(a:run)
|
|
else
|
|
call s:CompileLinux(a:run)
|
|
endif
|
|
endfunction
|
|
|