diff options
Diffstat (limited to 'common.sh.in')
-rw-r--r-- | common.sh.in | 126 |
1 files changed, 126 insertions, 0 deletions
diff --git a/common.sh.in b/common.sh.in new file mode 100644 index 0000000..2488a69 --- /dev/null +++ b/common.sh.in @@ -0,0 +1,126 @@ +# begin common.sh {{{ + +# Copyright (C) 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/>. + +unset IFS +IFS=$' \t\n' + +if type gettext &>/dev/null; then + _() { gettext "$@"; } +else + _() { echo "$@"; } +fi + +print() { + printf -- "$(_ "$1")\n" "${@:2}" +} + +flag() { + if [[ -z "$_flag_indent" ]]; then + local str=$(emacsclient --help | + sed -rn '/^-.*\s\s/{ s/(\s\s)\S.*/\1/p; q; }' | + expand) + declare -gi _flag_indent=${#str} + fi + local flag=$1 + if [[ ${#1} -ge $_flag_indent ]]; then + printf -- "%s\n" "$flag" + flag='' + fi + printf -- "%- ${_flag_indent}s%s\n" "$flag" "$(print "${@:2}")" +} + +error() { + printf -- "%s: %s\n" "$0" "$(print "$@")" >&2 +} + +emacs_quote() { + declare -a args=("$@") + args=("${args[@]//\\/\\\\}") # \ -> \\ + args=("${args[@]//\"/\\\"}") # " -> \" + printf -- '"%s" ' "${args[@]}" # wrap them in quotes, return +} + +version() { + print '%s (Emacs utils) %s, %s' \ + "${0##*/}" @VERSION@ "$(emacsclient --version)" +} + +# Sets the global variables: +# - emacs_getopt_o +# - emacs_getopt_l +# - emacs_getopt_1 +# - emacs_getopt_2 +emacs_getopt_init() { + declare ifs="$IFS" + + declare -a a_flags + IFS=$'\n' a_flags=($( + LC_ALL=C emacsclient --help | + grep ^- | + sed -e 's/\s\s.*//' -e 's/, /\n/g' | + sed -e 's/[ =].*/:/' -e 's/^-*//' | + grep -vEx 'e|eval')) + + declare -a a_flags_o a_flags_l a_flags_1 a_flags_2 + IFS=$'\n' a_flags_o=($(printf '%s\n' "${a_flags[@]}"|grep -v '^.[^:]')) + IFS=$'\n' a_flags_l=($(printf '%s\n' "${a_flags[@]}"|grep '^.[^:]')) + IFS=$'\n' a_flags_1=($(printf '%s\n' "${a_flags[@]}"|sed -rn -e 's/^(.)$/-\1/p' -e 's/^([^-].*[^:])$/--\1/p')) + IFS=$'\n' a_flags_2=($(printf '%s\n' "${a_flags[@]}"|sed -rn -e 's/^(.):$/-\1/p' -e 's/^([^-].*):$/--\1/p')) + + IFS='' emacs_getopt_o="${a_flags_o[*]}" + IFS=',' emacs_getopt_l="${a_flags_l[*]}" + IFS='|' emacs_getopt_2="^(${a_flags_2[*]})\$" + + IFS=$ifs +} + +# Sets the global variable: +# - args +emacs_getopt() { + declare o="$1" + declare l="$2" + shift 2 + [[ -z "${emacs_getopt_o}" ]] || + [[ -z "${emacs_getopt_l}" ]] || + emacs_getopt_init + getopt -a \ + -n "$0" \ + -o "${emacs_getopt_o}${o}" \ + -l "${emacs_getopt_l}${l:+,$l}" \ + -- "$@" +} + +emacs_usage() { + emacsclient --help | grep -E '^(\s|-)' +} + + +next() { + local mode=$1 + shift + case "$mode" in + error) print "Try \``%q --help'' for more information" "$0" >&2; return 1;; + usage) usage; return 0;; + version) version; return 0;; + normal) exec -- "$@";; + *) error 'Internal error. The programmer writing this tool screwed up.'; exit 1;; + esac +} + +# }}} end common.sh |