#!/bin/sh # This script will compile or run another finishing operation on a document. I # have this script run via Vim. # # tex files: Compiles to pdf, including bibliography if necessary # md files: Compiles to pdf via pandoc # rmd files: Compiles via R Markdown # c files: Compiles via whatever compiler is set to cc. Usually gcc. # Use make if Makefile exists. # py files: runs via python command # go files: compiles and runs with "go run" # config.def.h files: (For suckless utils) recompiles and installs program. # all others: run `sent` to show a presentation file=$(readlink -f "$1") ext="${file##*.}" dir=${file%/*} base="${file%.*}" cd "$dir" || exit Ifinstalled() { command -v "$1" >/dev/null || { notify-send "📦 $1 must be installed for this function." && exit 1; } } pandoccmd() { Ifinstalled pdflatex && pandoc -V geometry:margin=4cm -f markdown-implicit_figures "$1" -o "${2}.pdf" || Ifinstalled groff && pandoc "${1}" -t ms --pdf-engine-opt=-p -o "${2}.pdf" } pandocorg() { pandoccmd "$file" "$base"; } compilec() { [ -f "${dir}/Makefile" ] && make || cc "$file" -o "$base" && "$base"; } case "${ext}" in [0-9]) preconv "$file" | refer -PS -e | groff -mandoc -T pdf >"$base".pdf ;; apl) apl -f "$file" ;; c) compilec ;; cob) cobc -x -o "$base" "$file" && "$base" ;; config.h) make && sudo make install ;; cpp) g++ "$file" -o "$base" && "$base" ;; cs) mcs "$file" && mono "$base".exe ;; docx | *\.doc) Ifinstalled libreoffice && lowriter --convert-to pdf "$file" && exit Ifinstalled pandoc && pandoccmd "$file" "$base" && exit ;; dot | *\.gv) dot -Tsvg "$file" | convert svg:- "$base".eps ;; h) compilec ;; html) refreshbrowser ;; fnl) fennel --compile "$file" >"$base".lua ;; go) go run "$file" ;; java) javac "$file" && echo "${base##*/}" | xargs java ;; js) node "$file" ;; m) octave "$file" ;; md) pandoc "$file" -s --pdf-engine=xelatex -V geometry:margin=2cm -o "${base}.pdf" || { [ -x "$(command -v lowdown)" ] && lowdown --parse-no-intraemph "${file}" -Tms | groff -mpdfmark -ms -kept -T pdf >"${base}.pdf" || [ -x "$(command -v groffdown)" ] && groffdown -i "${file}" | groff -T pdf >"${base}.pdf" || pandoc -t ms --highlight-style="kate" -s -o "${base}.pdf" "${file}" } ;; me) groff -Gktes -b -w w -me -T ps "$file" | ps2pdf - >"$base".pdf ;; mm) groff -Gktes -b -w w -mm -mpic -T ps "$file" | ps2pdf - >"$base".pdf ;; mom) pdfroff -pktes -b -wall -mom -mpdfmark "$file" >"$base".pdf ;; ms | *\.groff) preconv "$file" | groff -Tpdf -ktesp -G -ms >"$base".pdf ;; org) Ifinstalled pandoc && pandocorg "$file" "$base" && exit ;; present) groff -p -e -t -mm -mpresent "$file" | presentps -l | ps2pdf - >"$base".pdf ;; ps) ps2pdf "$file" ;; py) python "$file" ;; [rR]md) Rscript -e "rmarkdown::render('$file', quiet=TRUE)" ;; r) R -f "$file" ;; rink) rink -f "${file}" ;; rkt) racket "$file" ;; rs) cargo build ;; sass) sassc -a "$file" "$base".css ;; scad) openscad -o "$base".stl "$file" ;; sent) setsid -f sent "$file" 2>/dev/null & ;; tex) latexmk ;; tcl) tclsh "$file" ;; vim*) vint "$file" ;; *) chmod +x "$file" && sed 1q "$file" | grep "^#!/" | sed "s/^#!//" | xargs -r -I % "$file" ;; esac