Dito. Für kleinere Sachen habe ich das hier:
" Funktion statt einzelnen Run-Skripten für die Programme. Allerdings
" kann es immernoch ein Run-Skript geben und das hat dann auch Vorrang.
" Man kann nämlich nicht alles automatisch mit dieser Funktion hier
" abbilden (mehrere Dateien, komplexe Parameter, ...).
fun! CompileAndRun(runProgram)
" Setze das Programm, was es auszuführen gälte. Muss hier passieren,
" da es ggf. später nicht mehr wegen "cw" geht, da das ein anderes
" Fenster öffnet und es da keinen Namen gibt. Die Variable
" l:interpreter gibt an, dass das Programm direkt ausgeführt werden
" soll -- ist sie 1, dann wird unterbunden, dass auf Ausführbarkeit
" des Programms getestet wird. l:domake weist einen Programmbau an.
" In l:run steht, wie ein eventuelles Run-Skript heißt.
let l:progname = './' . expand('%:t:r')
let l:interpreter = 0
let l:domake = 1
let l:runner = './run'
" Der normale make-Befehl piped das irgendwie an "tee" weiter. Das
" hat aber zur Folge, dass der Returncode vom ersten Befehl verloren
" geht. Das hier ist ein Tipp aus dem Netz, wie man trotzdem noch an
" den ersten Returncode herankommt:
setl shellpipe=2>&1\ \|\ tee\ %s;exit\ \${PIPESTATUS[0]}
" Finde heraus, mit was du das Programm bauen kannst.
if filereadable("SConstruct")
setl makeprg=scons
elseif filereadable("Makefile") || filereadable("makefile")
setl makeprg=make
elseif filereadable("build.xml")
setl makeprg=ant
elseif &filetype == 'c'
setl makeprg=gcc\ -Wall\ -o\ %<\ %
elseif &filetype == 'cpp'
setl makeprg=g++\ -Wall\ -o\ %<\ %
elseif &filetype == 'java'
setl makeprg=javac\ %
let l:progname = 'java ' . expand('%:t:r')
let l:interpreter = 1
elseif &filetype == 'matlab'
let l:progname = 'octave ' . expand('%') . ' | less'
let l:interpreter = 1
let l:domake = 0
else
" Bei allem anderen nimmst du an, dass die Datei selbst
" ausführbar ist und dass man sie nicht bauen muss. Das ist bei
" Skripten jeglicher Art der Fall. Ist sie doch nicht
" ausführbar, dann wird das unten abgefangen.
let l:progname = './' . expand('%')
let l:domake = 0
endif
" Speichern, bauen und ggf. ausführen.
write
if l:domake == 1
silent !echo -e "\n\nBuilding..."
make
cw
else
silent !echo -e "\n\nNot running build tool."
endif
if v:shell_error == 0 && a:runProgram == 1
if executable(l:runner)
silent !echo -e "\n\nExecuting run script..."
exec '!' . l:runner
elseif executable(l:progname) || l:interpreter == 1
silent exec '!echo -e "\n\nExecuting \"'
\. l:progname . '\""...'
exec '!' . l:progname
endif
endif
endfun
" Shortcuts für scons und make - nicht vergessen, dass für Screen
" eventuell das ein oder andere remapped werden muss, s.u.
map <F5> :call CompileAndRun(1)<CR>
map <S-F5> :call CompileAndRun(0)<CR>
map <C-F5> :w \| !./%<CR>
Das deckt natürlich bei weitem nicht alle Fälle ab und ist nicht universal nutzbar. Daher für größere Sachen einfach ein neues Terminal, wozu hat man denn sonst X. 😉