# begin common.sh {{{ # Copyright (C) 2013-2014, 2016-2017 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 . 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 local text text="$(print "${@:2}")" printf -- "%- ${_flag_indent}s%s\n" "$flag" "${text//$'\n'/"$(printf -- "\n%- ${_flag_indent}s%s\n" '')"}" } 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_2 emacs_getopt_init() { declare -a a_flags readarray -t 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_2 readarray -t a_flags_o < <(printf '%s\n' "${a_flags[@]}"|grep -v '^.[^:]') readarray -t a_flags_l < <(printf '%s\n' "${a_flags[@]}"|grep '^.[^:]') readarray -t a_flags_2 < <(printf '%s\n' "${a_flags[@]}"|sed -rn -e 's/^(.):$/-\1/p' -e 's/^([^-].*):$/--\1/p') local IFS IFS='' emacs_getopt_o="${a_flags_o[*]}" IFS=',' emacs_getopt_l="${a_flags_l[*]}" IFS='|' emacs_getopt_2="^(${a_flags_2[*]})\$" } # 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|-)' | grep -v '^-e, --eval' } 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