Re: Review of new man page of sensible-editor
RL <richard.lewis.debian-gM/[email protected]> Sun, 21 Aug 2022 16:15:08 +0100
| Newsgroups | gmane.linux.debian.internationalization.english |
|---|---|
| Message-ID | <[email protected]> |
Justin B Rye <[email protected]> writes: > RL wrote: >> #!/bin/sh >> # Copyright 2007 Jari Aalto; Released under GNU GPL v2 or any later version >> # Copyright 201 > > (I wonder what's going on here?) no idea >> # Prevent recursive loops, where environment variables are set to this script >> p="$(command -v "$0")" > > Of course this loop-detector won't catch VISUAL='sensible-editor --', > but I suppose that's just another variety of "don't do that then". maybe overkill, but i did find a way to catch that: and in doing so, i realised some other things: - there is no need to check for an exit status of 126 or 127 (which might mean anything): can just use command -v - the fix for #991982 isnt going to work if editor == nano (or the user has EDITOR='nano --') > I suspect this *could* use > > : "${HOME:=$( printf '%s' ~ )}" > > but that's too cunning for its own good. I dont think that works when HOME is empty (~ expands to the empty $HOME i would thinkpad) (other suggestions taken, including adding "busybox vi" to the end of the fallback list - why not!)
sensible-editor.new
(text/plain, 1.8 KB)
#!/bin/sh
# Copyright 2007 Jari Aalto; Released under GNU GPL v2 or any later version
# Copyright 201
# Prevent recursive loops, where environment variables are set to this script
this_script="$(command -v "$0")"
is_this_script(){
[ "$(command -v "$1")" = "$this_script" ]
}
# try editing using $candidate and exit. But do nothing if
# $candidate's first word is not runnable, points to this script or
# will not start with current TERM.
Try()
{
# $candidate must be unquoted as it may contain arguments
is_this_script $candidate && return 1
can_run $candidate || return 1
term_is_ok_for $candidate || return 1
exec $candidate "$@"
}
# exists and is executable
can_run(){
command -v "$1" >/dev/null
}
# work around for #991982
term_is_ok_for(){
# either TERM is set (to anything) or $1 can not run with an empty TERM
[ -n "$TERM" ] && return 0
prog="$(basename "$(realpath "$(command -v "$1")")")"
[ "$prog" != "nano" ] && [ "$prog" != "nano-tiny" ] && [ "$prog" != "jed" ]
}
for candidate in "$VISUAL" "$EDITOR"; do
Try "$@"
done
if [ -n "$HOME" ]; then
# fix #987675: HOME should be set before using select-editor(1)
if [ -r ~/.selected_editor ]; then
. ~/.selected_editor 2>/dev/null
fi
# if we ended up with $this_script or nothing then run
# select-editor(1)
is_this_script $EDITOR && EDITOR=
is_this_script $SELECTED_EDITOR && SELECTED_EDITOR=
if [ -z "$EDITOR" ] && [ -z "$SELECTED_EDITOR" ] && [ -t 0 ]; then
select-editor && . ~/.selected_editor 2>/dev/null
fi
fi
if term_is_ok_for editor; then
editor="editor"
else
# editor(1) will not run with TERM's current setting
editor=""
fi
for candidate in "$EDITOR" "$SELECTED_EDITOR" $editor nano nano-tiny vi "busybox vi"; do
Try "$@"
done
echo "Couldn't find an editor!" 1>&2
echo 'Set the $EDITOR environment variable to your desired editor.' 1>&2
exit 1