#!/usr/bin/env sh # compat: +ash +bash +dash -hush -ksh +mksh +oksh +osh +posh +yash +zsh e() { ### @- ### wrap around `$EDITOR` to run it as root if necessary. ### this still needs some work to detect root-owned directories. ### ### ``` ### $ e /etc/sudoers ### [sudo] password for notwa: ### ``` ### ### **NOTE:** there also exists an e(1) program provided by ### the *e-wrapper* package that i don't use. [ -z "$ZSH_OPTIONS" ] || setopt local_options sh_word_split local d= f= temp= running= editor= needroot=0 editor="${EDITOR%% *}" (running pid cmd | while read -r pid cmd; do if [ "$cmd" = "$editor" ]; then printf "%s (%s)\n" "$editor is already running" "$pid" >&2 confirm exit fi done) || return for f; do temp="$(readlink -f "$f")" && f="$temp" [ -z "$MSYSTEM" ] || f="$(cygpath -u "$f")" || continue # easy: file exists, we have write permissions [ -w "$f" ] && continue # easy: file exists, but no write permissions [ -e "$f" ] && { needroot=1; break; } # hard: file may be in a directory that we can't inspect d="$f" while [ "${d%/*}" != "$d" ]; do d="${d%/*}" [ -w "$d/" ] && break [ -e "$d/" ] && { needroot=1; break; } done [ $needroot = 1 ] && break # easy: file just doesn't exist done if [ $needroot = 1 ] && [ -n "$MSYSTEM" ]; then # this pretty much never happens, because permissions are so busted, but... printf "NOTE: you need root permissions, but this is Windows." >&2 printf " this probably isn't going to work." >&2 pause $EDITOR "$@" elif [ $needroot = 0 ]; then $EDITOR "$@" else sudo -e "$@" fi } [ -n "${preload+-}" ] || . ~/sh/preload || exit 2 eval ${preload:-preload} running confirm pause [ -n "${preload+-}" ] || e "$@"