dotfiles

configuration files for shell, text editor, graphical environment, etc.
git clone git://src.adamsgaard.dk/dotfiles
Log | Files | Refs | README | LICENSE Back to index

commit ad22b936626f5e473c4625564b8d0c616e594424
parent 56df91d05d8edf72abdf6d85e4b436c59e925716
Author: Anders Damsgaard <anders@adamsgaard.dk>
Date:   Tue, 30 Jun 2020 11:43:01 +0200

Rename document compiler and improve help text

Diffstat:
M.exrc | 6+++---
A.local/bin/cdoc | 143+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
D.local/bin/compile | 140-------------------------------------------------------------------------------
3 files changed, 146 insertions(+), 143 deletions(-)

diff --git a/.exrc b/.exrc @@ -26,8 +26,8 @@ map =N :set nonumber " add pipe symbol by prefix with ^V character (press C-v twice): | map qB :Edit $BIB -map qc :!compile % -map qC :!tmux new-window -c "$(pwd)" compile -c -o % \; previous-window +map qc :!cdoc % +map qC :!tmux new-window -c "$(pwd)" cdoc -c -o % \; previous-window map qd :r !date map qD :r !date +'\%m/\%d' A map qe :edit @@ -35,7 +35,7 @@ map qj :r !jabbrev map qm :!make map qM :!tmux split-window -p 25 make \; select-pane -l map qn I- [ ]  -map qo :!compile -o % +map qo :!cdoc -o % map qp :r !xclip -o map qP :r !xclip -o -selection clipboard map qr :r !scholarref diff --git a/.local/bin/cdoc b/.local/bin/cdoc @@ -0,0 +1,143 @@ +#!/bin/sh +opener=xdg-open + +show_help() { + printf 'usage: %s [OPTIONS] FILE ...\n' "${0##*/}" + printf 'compiles each FILE to pdf. Supported input file types are:\n' + printf ' - latex (extension .tex) including dependency recursion\n' + printf ' - gnuplot (extension .gp)\n' + printf ' - mandoc (extension .[0-9])\n' + printf ' - groff/mom (extension .mom)\n' + printf 'OPTIONS are one or more of the following:\n' + printf ' -h show this message\n' + printf ' -c continuously recompile upon file changes (requires entr(1))\n' + printf ' -o open output file after compiling (requires %s(1))\n' "$opener" + printf ' -- do not consider any following args as options\n' +} + +die() { + printf '%s: error: %s\n' "${0##*/}" "$1" >&2 + exit 1 +} + +regeximatch() { + printf '%s' "$1" | grep -iEq "$2" +} + +extract_tex_include() { + d="$(grep -v ".*%.*\\${2}" "$1" | + sed -nE "/.*\\${2}\\[*.*\\]*\\{([^}]*)\\}.*/{ s//\\1/;p; }")" + if [ "$2" = "bibliography" ] && [ -n "$d" ]; then + d="${d%.bib}.bib" + fi + if [ -n "$d" ]; then + printf '%s\n' "$d" + fi +} + +find_dependencies() { + case "$1" in + *.tex) + printf '%s\n' "$1" + if grep -q -e '\input{' \ + -e '\include[graphics]' \ + -e '\addbibresource{' \ + -e '\bibliography{' \ + "$1"; then + extract_tex_include "$1" 'input' + extract_tex_include "$1" 'include' + extract_tex_include "$1" 'includegraphics' + extract_tex_include "$1" 'addbibresource' + extract_tex_include "$1" 'bibliography' + fi;; + *) + die "cannot find dependencies in unknown file type $1";; + esac +} + +run_compile() { + if [ "$continuous" = 1 ]; then + printf '%s\n' "$2" | entr -s "$1" + else + eval "$1" + fi +} + +handle_target() { + base="$(basename "${1%.*}")" + if [ -e "$1" ]; then + case "$1" in + *.tex) + deps="$1" + deps="$(find_dependencies "$1")" + for d in $deps; do + if [ "${d##*.}" = "tex" ]; then + deps="$(printf '%s\n%s\n' "${deps}" "$(find_dependencies "$d")")" + fi + done + deps="$(printf '%s\n' "$deps" | sort | uniq)" + printf 'deps=%s\n' "$deps" + if regeximatch "$deps" '\.bib'; then + compile_string="pdflatex '$1'; bibtex '${1%.tex}'; pdflatex '$1'; pdflatex '$1'" + else + compile_string="pdflatex '$1' && pdflatex '$1'" + fi + run_compile "$compile_string" "$deps" + if [ "$open" = 1 ]; then + $opener "${1%.tex}.pdf" + fi + ;; + *.gp) + run_compile "gnuplot '$1'" "$1";; + *.[0-9]) + out="$(basename "${base}").pdf" + if [ "$open" = 1 ]; then + run_compile "refer -PS -e '$1' | groff -mandoc -T pdf > '$out' && $opener '$out'" "$1" + else + run_compile "refer -PS -e '$1' | groff -mandoc -T pdf > '$out'" "$1" + fi;; + *.mom) + out="$(basename "${base}").pdf" + if [ "$open" = 1 ]; then + run_compile "pdfmom '$1' > '$out' && $opener '$out'" "$1" + else + run_compile "pdfmom '$1' > '$out'" "$1" + fi;; + *) + die "File type ${1##*.} not supported\\n";; + esac + else + die "cannot read $1" + fi +} + +continuous=0 +open=0 +while :; do + case "$1" in + -h|-\?) + show_help + exit 0;; + -c) + continuous=1;; + -o) + open=1;; + --) # end all options + shift + break;; + -?*) + die 'unknown option specified';; + *) # No more options + break + esac + shift +done + +if [ $# -lt 1 ]; then + show_help + exit 1 +else + for f in "$@"; do + handle_target "$f" + done +fi diff --git a/.local/bin/compile b/.local/bin/compile @@ -1,140 +0,0 @@ -#!/bin/sh -opener=xdg-open - -show_help() { - echo "usage: ${0##*/} [OPTIONS] FILE ..." - echo "compiles each FILE based on its extension." - echo - echo "OPTIONS are one or more of the following:" - echo " -h show this message" - echo " -c continuously recompile upon file changes (requires entr(1))" - echo " -o open output file after compiling (requires ${opener}(1))" - echo " -- do not consider any following args as options" -} - -die() { - printf '%s: error: %s\n' "${0##*/}" "$1" >&2 - exit 1 -} - -regeximatch() { - printf '%s' "$1" | grep -iEq "$2" -} - -extract_tex_include() { - d="$(grep -v ".*%.*\\${2}" "$1" | - sed -nE "/.*\\${2}\\[*.*\\]*\\{([^}]*)\\}.*/{ s//\\1/;p; }")" - if [ "$2" = "bibliography" ] && [ -n "$d" ]; then - d="${d%.bib}.bib" - fi - if [ -n "$d" ]; then - printf '%s\n' "$d" - fi -} - -find_dependencies() { - case "$1" in - *.tex) - printf '%s\n' "$1" - if grep -q -e '\input{' \ - -e '\include[graphics]' \ - -e '\addbibresource{' \ - -e '\bibliography{' \ - "$1"; then - extract_tex_include "$1" 'input' - extract_tex_include "$1" 'include' - extract_tex_include "$1" 'includegraphics' - extract_tex_include "$1" 'addbibresource' - extract_tex_include "$1" 'bibliography' - fi;; - *) - die "cannot find dependencies in unknown file type $1";; - esac -} - -run_compile() { - if [ "$continuous" = 1 ]; then - printf '%s\n' "$2" | entr -s "$1" - else - eval "$1" - fi -} - -handle_target() { - base="$(basename "${1%.*}")" - if [ -e "$1" ]; then - case "$1" in - *.tex) - deps="$1" - deps="$(find_dependencies "$1")" - for d in $deps; do - if [ "${d##*.}" = "tex" ]; then - deps="$(printf '%s\n%s\n' "${deps}" "$(find_dependencies "$d")")" - fi - done - deps="$(printf '%s\n' "$deps" | sort | uniq)" - printf 'deps=%s\n' "$deps" - if regeximatch "$deps" '\.bib'; then - compile_string="pdflatex '$1'; bibtex '${1%.tex}'; pdflatex '$1'; pdflatex '$1'" - else - compile_string="pdflatex '$1' && pdflatex '$1'" - fi - run_compile "$compile_string" "$deps" - if [ "$open" = 1 ]; then - $opener "${1%.tex}.pdf" - fi - ;; - *.gp) - run_compile "gnuplot '$1'" "$1";; - *.[0-9]) - out="$(basename "${base}").pdf" - if [ "$open" = 1 ]; then - run_compile "refer -PS -e '$1' | groff -mandoc -T pdf > '$out' && $opener '$out'" "$1" - else - run_compile "refer -PS -e '$1' | groff -mandoc -T pdf > '$out'" "$1" - fi;; - *.mom) - out="$(basename "${base}").pdf" - if [ "$open" = 1 ]; then - run_compile "pdfmom '$1' > '$out' && $opener '$out'" "$1" - else - run_compile "pdfmom '$1' > '$out'" "$1" - fi;; - *) - die "File type ${1##*.} not supported\\n";; - esac - else - die "cannot read $1" - fi -} - -continuous=0 -open=0 -while :; do - case "$1" in - -h|-\?) - show_help - exit 0;; - -c) - continuous=1;; - -o) - open=1;; - --) # end all options - shift - break;; - -?*) - die 'unknown option specified';; - *) # No more options - break - esac - shift -done - -if [ $# -lt 1 ]; then - show_help - exit 1 -else - for f in "$@"; do - handle_target "$f" - done -fi