#!@bash@ # Copyright (C) 2011, 2013-2014, 2016 Luke Shumaker # # 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 . m4_include(common.sh.in) usage() { print "Usage: %q [OPTIONS] [PROGRAM]" "$0" print " or: %q [OPTIONS] -e COMMAND" "$0" print " or: %q [OPTIONS] -e PROGRAM [ARGS...]" "$0" print 'A wrapper around emacsterm that behaves like xterm' echo print 'The "-e" option cannot be combined with other short options.' echo print \ 'This tool does not (yet?) do any of the mucking around with SHELL, XTERM_SHELL, /etc/shells, or the user database (/etc/passwd) that xterm does. The simplified behavior is that 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 $(_ 'COMMAND|')" '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 xterm weirdness if ! $e; then case $# in 0) prog=("${SHELL:-/bin/sh}");; 1) prog=("$1");; *) shift; error 'Extra arguments: %s' "$*"; mode=error;; esac else case $# in 0) getopt -Q -n "$0" e: -e; mode=error;; 1) prog=(sh -c "$1");; *) prog=("$@");; esac fi fi next "$mode" \ emacsterm "${flags[@]}" -- "${prog[@]}" } main "$@"