summaryrefslogtreecommitdiff
path: root/common.sh.in
diff options
context:
space:
mode:
Diffstat (limited to 'common.sh.in')
-rw-r--r--common.sh.in126
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