# shellcheck source=../submodules/bash-zsh-compat-widgets/bindfunc.sh . ~/.resh/bindfunc.sh # shellcheck source=widgets.sh . ~/.resh/widgets.sh __resh_bind_arrows() { if [ "${__RESH_arrow_keys_bind_enabled-0}" != 0 ]; then echo "RESH arrow key bindings are already enabled!" return 1 fi bindfunc --revert '\eOA' __resh_widget_arrow_up_compat __RESH_bindfunc_revert_arrow_up_bind=$_bindfunc_revert bindfunc --revert '\e[A' __resh_widget_arrow_up_compat __RESH_bindfunc_revert_arrow_up_bind_vim=$_bindfunc_revert bindfunc --vim-cmd --revert 'k' __resh_widget_arrow_up_compat __RESH_bindfunc_revert_k_bind_vim=$_bindfunc_revert bindfunc --revert '\eOB' __resh_widget_arrow_down_compat __RESH_bindfunc_revert_arrow_down_bind=$_bindfunc_revert bindfunc --revert '\e[B' __resh_widget_arrow_down_compat __RESH_bindfunc_revert_arrow_down_bind_vim=$_bindfunc_revert bindfunc --vim-cmd --revert 'j' __resh_widget_arrow_down_compat __RESH_bindfunc_revert_j_bind_vim=$_bindfunc_revert __RESH_arrow_keys_bind_enabled=1 return 0 } __resh_nop() { # does nothing true } __resh_bind_control_R() { if [ "${__RESH_control_R_bind_enabled-0}" != 0 ]; then echo "RESH SEARCH app Ctrl+R binding is already enabled!" return 1 fi bindfunc --revert '\C-r' __resh_widget_control_R_compat __RESH_bindfunc_revert_control_R_bind=$_bindfunc_revert __RESH_control_R_bind_enabled=1 if [ -n "${BASH_VERSION-}" ]; then # fuck bash bind '"\C-r": "\u[31~\u[32~"' bind -x '"\u[31~": __resh_widget_control_R_compat' # execute # bind '"\u[32~": accept-line' # just paste # bind -x '"\u[32~": __resh_nop' true fi return 0 } __resh_unbind_arrows() { if [ "${__RESH_arrow_keys_bind_enabled-0}" != 1 ]; then echo "RESH arrow key bindings are already disabled!" return 1 fi if [ -z "${__RESH_bindfunc_revert_arrow_up_bind+x}" ]; then echo "Warn: Couldn't revert arrow UP binding because 'revert command' is empty." else eval "$__RESH_bindfunc_revert_arrow_up_bind" [ -z "${__RESH_bindfunc_revert_arrow_up_bind_vim+x}" ] || eval "$__RESH_bindfunc_revert_arrow_up_bind_vim" [ -z "${__RESH_bindfunc_revert_k_bind_vim+x}" ] || eval "$__RESH_bindfunc_revert_k_bind_vim" echo "RESH arrow up binding successfully disabled" __RESH_arrow_keys_bind_enabled=0 fi if [ -z "${__RESH_bindfunc_revert_arrow_down_bind+x}" ]; then echo "Warn: Couldn't revert arrow DOWN binding because 'revert command' is empty." else eval "$__RESH_bindfunc_revert_arrow_down_bind" [ -z "${__RESH_bindfunc_revert_arrow_down_bind_vim+x}" ] || eval "$__RESH_bindfunc_revert_arrow_down_bind_vim" [ -z "${__RESH_bindfunc_revert_j_bind_vim+x}" ] || eval "$__RESH_bindfunc_revert_j_bind_vim" echo "RESH arrow down binding successfully disabled" __RESH_arrow_keys_bind_enabled=0 fi return 0 } __resh_unbind_control_R() { if [ "${__RESH_control_R_bind_enabled-0}" != 1 ]; then echo "RESH SEARCH app Ctrl+R binding is already disabled!" return 1 fi if [ -z "${__RESH_bindfunc_revert_control_R_bind+x}" ]; then echo "Warn: Couldn't revert Ctrl+R binding because 'revert command' is empty." else eval "$__RESH_bindfunc_revert_control_R_bind" fi __RESH_control_R_bind_enabled=0 return 0 } __resh_bind_all() { __resh_bind_arrows __resh_bind_control_R } __resh_unbind_all() { __resh_unbind_arrows __resh_unbind_control_R } # wrapper for resh-cli for calling resh directly resh() { local buffer local git_remote; git_remote="$(git remote get-url origin 2>/dev/null)" buffer=$(resh-cli --sessionID "$__RESH_SESSION_ID" --host "$__RESH_HOST" --pwd "$PWD" --gitOriginRemote "$git_remote" $@) status_code=$? if [ $status_code = 111 ]; then # execute echo "$buffer" eval "$buffer" elif [ $status_code = 0 ]; then # paste echo "$buffer" elif [ $status_code = 130 ]; then true else echo "$buffer" >| ~/.resh/cli_last_run_out.txt echo "resh-cli ERROR:" cat ~/.resh/cli_last_run_out.txt fi } reshctl() { # local log=~/.resh/reshctl.log # export current shell because resh-control needs to know export __RESH_ctl_shell=$__RESH_SHELL # run resh-control aka the real reshctl resh-control "$@" # modify current shell session based on exit status local _status=$? # echo $_status # unexport current shell unset __RESH_ctl_shell case "$_status" in 0|1) # success | fail return "$_status" ;; # enable # 30) # # enable all # __resh_bind_all # return 0 # ;; 31) # enable arrow keys __resh_bind_arrows return 0 ;; 32) # enable control R __resh_bind_control_R return 0 ;; # disable # 40) # # disable all # __resh_unbind_all # return 0 # ;; 41) # disable arrow keys __resh_unbind_arrows return 0 ;; 42) # disable control R __resh_unbind_control_R return 0 ;; 50) # reload rc files . ~/.resh/shellrc return 0 ;; 51) # inspect session history # reshctl debug inspect N resh-inspect --sessionID "$__RESH_SESSION_ID" --count "${3-10}" return 0 ;; 52) # show status if [ "${__RESH_arrow_keys_bind_enabled-0}" != 0 ]; then echo ' * this session: ENABLED' else echo ' * this session: DISABLED' fi echo echo 'Control R binding ...' if [ "$(resh-config --key BindControlR)" = true ]; then echo ' * future sessions: ENABLED (experimental)' else echo ' * future sessions: DISABLED' fi if [ "${__RESH_control_R_bind_enabled-0}" != 0 ]; then echo ' * this session: ENABLED' else echo ' * this session: DISABLED' fi return 0 ;; *) echo "reshctl() FATAL ERROR: unknown status ($_status)" >&2 echo "Possibly caused by version mismatch between installed resh and resh in this session." >&2 echo "Please REPORT this issue here: https://github.com/curusarn/resh/issues" >&2 echo "Please RESTART your terminal window." >&2 return "$_status" ;; esac }