diff --git a/bin/doomscript b/bin/doomscript new file mode 100755 index 000000000..c6626de3c --- /dev/null +++ b/bin/doomscript @@ -0,0 +1,61 @@ +#!/usr/bin/env sh +# This is a shebang interpreter for launching emacs lisp scripts with Doom's CLI +# framework preloaded and all the metadata it needs initialized. Use it like so: +# +# #!/usr/bin/env doomscript +# (print! "Hello world!") +# +# For this to work, this file must be in your $PATH. +# +# export PATH="$HOME/.emacs.d/bin:$PATH" +# +# This can also be exploited to evaluate arbitrary elisp against Doom's CLI +# environment. +# +# This isn't used for bin/doom because of the $PATH requirement (and using +# $BASH_SOURCE to locate it would reduce its POSIX compliance). This shouldn't +# be an issue for folks writing their own CLIs, however. + +set -e +case "$EMACS" in + *term*) EMACS=emacs ;; + *) EMACS="${EMACS:-emacs}" ;; +esac + +TMPDIR=${TMPDIR:-`$EMACS -Q --batch --eval '(princ (temporary-file-directory))' 2>/dev/null`} +if [ -z "$TMPDIR" ]; then + >&2 echo "Error: failed to run Emacs with command '$EMACS'" + >&2 echo + >&2 echo "Are you sure Emacs is installed and in your \$PATH?" + exit 1 +fi + +if [ -z "$EMACSDIR" ]; then + EMACSDIR="${XDG_CONFIG_HOME:-$HOME/.config}/emacs" + [ -d "$EMACSDIR" ] || EMACSDIR="$HOME/.emacs.d" + if [ ! -d "$EMACSDIR" ]; then + >&2 echo "Failed to find \$EMACSDIR in ~/.config/emacs or ~/.emacs.d" + exit 1 + fi +fi + +export __DOOMPID="${__DOOMPID:-$$}" +export __DOOMSTEP="$((__DOOMSTEP+1))" +export __DOOMGEOM="${__DOOMGEOM:-`tput cols lines 2>/dev/null`}" +export __DOOMGPIPE=${__DOOMGPIPE:-$__DOOMPIPE} +export __DOOMPIPE=; [ -t 0 ] || __DOOMPIPE+=0; [ -t 1 ] || __DOOMPIPE+=1 + +tmpfile="$TMPDIR/doomscript.${__DOOMPID}" + +target="$1" +shift +$EMACS -Q --batch \ + --load "$EMACSDIR/core/core-cli" \ + --load "$target" \ + -- "$@" || exit=$? +# Execute exit-script, if requested (to simulate execve) +if [ "${exit:-0}" -eq 254 ]; then + sh "${tmpdir}/doom.${__DOOMPID}.${__DOOMSTEP}.sh" "$0" "$@" && true + exit="$?" +fi +exit $exit