#!/bin/bash
#########################################################
# 							#
# This is BashStyle-NG  				#
#							#
# Licensed under GNU GENERAL PUBLIC LICENSE v3    	#
#							#
# Copyright Christopher Roy Bratušek			#
#							#
#########################################################

dbg_msg "$(eval_gettext "BashStyle-NG Loading:")" KeybindingsCFG

function list_keybindings () {
	bind -P | sed -e '/is not/d;s/can be found on/:/' | column -s : -t
}

keybindings_setter () {
	if [[ -n "${1}" ]]; then
		MOD=${1/:*}
		KEY=${1/*:}

		case ${2} in
			complete-path)	ACT='"\eb`which \ef` \e\C-e"' ;;
			rerun-root)	ACT='"\ebsudo !!\e\C-e\C-j"' ;;
			list-keys)	ACT='"\eblist_keybindings\e\C-e\C-j"' ;;
			*)		ACT="${2}" ;;
		esac

		case ${MOD} in
			e)
				dbg_msg "$(eval_gettext "KeybindingsCFG Setting:")" "${ACT}" e-"${KEY}"
				dbg_msg "\\e${KEY}":self-insert
				bind "\\e${KEY}":self-insert
				dbg_msg \"\\e"${KEY}"\":"${ACT}"
				printf '%s\n' "\"\\e${KEY}\":${ACT}" >> "${RC_FILE}"
			;;
			C)
				dbg_msg "$(eval_gettext "KeybindingsCFG Setting:")" "${ACT}" C-"${KEY}"
				dbg_msg "\\C-${KEY}":self-insert
				bind "\\C-${KEY}":self-insert
				dbg_msg \"\\C-"${KEY}"\":"${ACT}"
				printf '%s\n' "\"\\C-${KEY}\":${ACT}" >> "${RC_FILE}"
			;;
			X)
				dbg_msg "$(eval_gettext "KeybindingsCFG Setting:")" "${ACT}" "${KEY}"
				#bind "${KEY}":self-insert
				dbg_msg "${KEY}":"${ACT}"
				printf '%s\n' "${KEY}:${ACT}" >> "${RC_FILE}"
			;;
		esac
	fi
}

shopt -s nullglob
bsng_keybindingsrc=( "${HOME}"/.keybindings.bs-ng.* )
shopt -u nullglob

if (( "${#bsng_keybindingsrc[@]}" == 0 )); then

	export RC_FILE
	RC_FILE="${HOME}/.keybindings.bs-ng.${BSNG_SESSION_TIME}_${BASH_SESSION_PID}"
	dbg_msg "$(eval_gettext "KeybindingsCFG Loading:")" "$(eval_gettext "Keybindings")"

	for key in undo upcase_word capitalize_word downcase_word transpose_words \
		transpose_chars unix_word_rubout kill_word possible_filename_completions \
		possible_hostname_completions possible_username_completions \
		possible_variable_completions kill_line unix_line_discard \
		beginning_of_line end_of_line clear_screen history_search_forward \
		history_search_backward complete_path menu_complete alias_expand_line \
		backward_char backward_word backward_delete_char delete_char \
		copy_backward_word copy_forward_word forward_char forward_word \
		overwrite_mode menu_complete_backward rerun_root backward_kill_line \
		list_keys next_screen_line previous_screen_line spell_correct_word \
		fetch_history; do

			keybindings_setter "$(ini_get $key)" "${key//_/-}"

	done

	if [[ $(ini_get prompt_style) == equinox ]]; then
		# make the prompt properly re-draw when pressing [Return]
		dbg_msg "$(eval_gettext "KeybindingsCFG Setting:")" Equinox "$(eval_gettext "Return-Key compat")"
		dbg_msg 'RETURN: "\C-l\C-j"'
		echo -E 'RETURN: "\C-l\C-j"' >> "${RC_FILE}"
	fi

	mv "${RC_FILE}" "${HOME}"/.keybindings
	unset RC_FILE
fi

bind -f "${HOME}"/.keybindings

unset MOD KEY ACT bsng_keybindingsrc key
