#!/bin/bash # "test edit" - makes a temporary file and edits it # requires: bash (uses arrays) set -eu pname="${0##*/}" ed() { ${EDITOR:-nvim} "$@" } usage() { echo '"Test edit" - edit a temporary file for testing code fragments' echo "" echo "Usage: $pname [OPTIONS] [file] [ed-opts] [--] [cmd]..." echo "" echo "Arguments:" echo " file A file to edit. Also acts as the name for the directory." echo " ed-opts Any option to pass to the editor. (eg. another file name)" echo " cmd... A list of commands to EVALuate after the editor exits. (example: bash)" echo ' Exposed variables:' echo ' $filename - the name of the file specified for `file`' echo ' $tempdir - the directory the editor was launched in.' echo ' $ed_args - array of arguments passed to the editor.' echo ' $cmd_args - the array of commands specified in the `cmd...` option' echo "" echo "Options:" echo " -h, --help Print usage information and exit. This only gets read in the first argument position." echo "" echo "Environment:" echo " EDITOR The editor you want to use." echo "" echo "Examples:" echo " Edit hello.sh and then run bash (so you can run it)" echo " $pname hello.sh -- bash" echo " Edit hello.sh and then run it" echo " $pname hello.sh -- ./hello.sh" echo " Edit hello.sh and then run it (using a variable)" echo " $pname hello.sh -- ./\$filename" echo " Edit hello-world.c and hello-lib.c, then compile with gcc and run bash" echo " $pname hello-world.c hello-lib.c -- 'gcc -o hello \"\${ed_args[@]}\"' './hello' bash" } if [[ $# = 0 ]]; then usage; exit 1; fi case "${1:-}" in -h|--help) usage; exit;; esac filename="$1"; shift dirname="${filename%%.*}" tests_dir="${XDG_DOCUMENTS_DIR:-"$HOME"/Documents}/code-tests" date="$(date +%F)" tempdir="$tests_dir/$date-$dirname" mkdir -p "$tempdir" # build an argument list for the editor ed_args=("$filename") cmds=("$SHELL") for a;do shift # stop reading after -- if [ "$a" = -- ]; then cmds=("$@") break fi ed_args+=("$a") done cd "$tempdir" # launch editor ed "${ed_args[@]}" # launch the command if [ "${#cmds}" != 0 ]; then for cmd in "${cmds[@]}"; do (eval "$cmd") done fi # check if directory is empty. If it is, remove it. filecount="$(find . -maxdepth 1 -print | wc -l)" if [ "$filecount" = 0 ]; then rmdir "$tempdir" fi