summaryrefslogtreecommitdiff
path: root/emacsterm-rxvt.sh.in
diff options
context:
space:
mode:
authorLuke Shumaker <lukeshu@sbcglobal.net>2016-06-08 23:20:23 -0400
committerLuke Shumaker <lukeshu@sbcglobal.net>2016-06-08 23:20:23 -0400
commit5f29a477f190b9f4c0d3835574dfbcbad19d827c (patch)
treea2eef90f0afd351c65edb7aae5c9dc45699dedd9 /emacsterm-rxvt.sh.in
parent8c67cad1f2bbcaabe23586643d670ba08f3d2a05 (diff)
emacsterm: sane option parsing; create emacsterm-{xterm,rxvt} for insanity
Diffstat (limited to 'emacsterm-rxvt.sh.in')
-rw-r--r--emacsterm-rxvt.sh.in100
1 files changed, 100 insertions, 0 deletions
diff --git a/emacsterm-rxvt.sh.in b/emacsterm-rxvt.sh.in
new file mode 100644
index 0000000..8b3d3ef
--- /dev/null
+++ b/emacsterm-rxvt.sh.in
@@ -0,0 +1,100 @@
+#!@bash@
+
+# Copyright (C) 2011, 2013-2014, 2016 Luke Shumaker <lukeshu@sbcglobal.net>
+#
+# This file is not considered part of GNU Emacs.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+m4_include(common.sh.in)
+
+usage() {
+ print "Usage: %q [OPTIONS] [-e PROGRAM [ARGS...]]" "$0"
+ print 'A wrapper around emacsterm that behaves like rxvt'
+ echo
+ print 'The "-e" option cannot be combined with other short options.'
+ echo
+ print 'If the "-e" option is not given, then "${SHELL:-/bin/sh}" is used.'
+ echo
+ print 'The following OPTIONS are accepted:'
+ emacs_usage
+ flag "-T $(_ FUNCTION)" 'Use Emacs Lisp FUNCTION instead of "term"'
+ flag "-e $(_ 'PROGRAM [ARGS...]')" 'Specify the command to execute'
+ echo
+ print 'Bugs:'
+ print \
+'The string "-e" cannot be used as an argument to flags that take
+arguments.'
+}
+
+
+main() {
+ # Run through and check for the -e flag
+ declare e=false
+ declare -a arg_ary=("$@")
+ declare -i i=0
+ while [[ $i -lt ${#arg_ary[@]} ]]; do
+ case "${arg_ary[$i]}" in
+ '-e') e=true; arg_ary[$i]='--'; break;;
+ '--') error 'bad command line option "--"'; next error; return $?;;
+ esac
+ i+=1
+ done
+
+ declare -a flags=()
+ declare -a prog=()
+ declare mode=normal
+
+ emacs_getopt_init
+ declare args
+ if ! args="$(emacs_getopt T: '' "${arg_ary[@]}")"; then
+ mode=error
+ else
+ # Pretty much identical option parsing to emacsterm
+ eval set -- "$args"
+ while true; do
+ case "$1" in
+ -V|--version) shift; mode=version;;
+ -H|--help) shift; mode=usage;;
+ -T) flags+=("$1" "$2"); shift 2;;
+ --) shift; break;;
+ *)
+ if [[ $1 =~ $emacs_getopt_2 ]]; then
+ flags+=("$1" "$2"); shift 2
+ else
+ flags+=("$1"); shift 1
+ fi
+ ;;
+ esac
+ done
+
+ # Now for the rxvt weirdness
+ if ! $e; then
+ case $# in
+ 0) prog=("${SHELL:-/bin/sh}");;
+ *) error 'Extra arguments: %s' "$*"; mode=error;;
+ esac
+ else
+ case $# in
+ 0) getopt -Q -n "$0" e: -e; mode=error;;
+ *) prog=("$@");;
+ esac
+ fi
+ fi
+
+ next "$mode" \
+ emacsterm "${flags[@]}" -- "${prog[@]}"
+}
+
+main "$@"