diff options
Diffstat (limited to 'common.sh')
-rw-r--r-- | common.sh | 109 |
1 files changed, 109 insertions, 0 deletions
diff --git a/common.sh b/common.sh new file mode 100644 index 0000000..61fa26f --- /dev/null +++ b/common.sh @@ -0,0 +1,109 @@ +# begin common.sh {{{ + +# Copyright (C) 2013-2014 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/>. + +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 + printf -- "%- ${_flag_indent}s%s\n" "$1" "$(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 +} + +bash_quote() { + printf -- '%q ' "$@" +} + +version() { + print '%s (Emacs utils) %s, %s' \ + "${0##*/}" 0.9 "$(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|-)' +} + +# }}} end common.sh |