mirror of
https://github.com/tmux-plugins/tmux-resurrect.git
synced 2024-11-15 08:58:50 +00:00
4941cdb074
When pane_full_command has no arguments, the regex doesn't find argv[0] as there is no trailing space. For example, if pane_full_command was "vim" and the restore option was "~Vim->vim *", the command "vim vim" would get executed instead of just "vim". Make the trailing space optional to match having only the command without arguments.
199 lines
5.6 KiB
Bash
199 lines
5.6 KiB
Bash
restore_pane_processes_enabled() {
|
|
local restore_processes="$(get_tmux_option "$restore_processes_option" "$restore_processes")"
|
|
if [ "$restore_processes" == "false" ]; then
|
|
return 1
|
|
else
|
|
return 0
|
|
fi
|
|
}
|
|
|
|
restore_pane_process() {
|
|
local pane_full_command="$1"
|
|
local session_name="$2"
|
|
local window_number="$3"
|
|
local pane_index="$4"
|
|
local dir="$5"
|
|
local command
|
|
if _process_should_be_restored "$pane_full_command" "$session_name" "$window_number" "$pane_index"; then
|
|
tmux switch-client -t "${session_name}:${window_number}"
|
|
tmux select-pane -t "$pane_index"
|
|
|
|
local inline_strategy="$(_get_inline_strategy "$pane_full_command")" # might not be defined
|
|
if [ -n "$inline_strategy" ]; then
|
|
# inline strategy exists
|
|
# check for additional "expansion" of inline strategy, e.g. `vim` to `vim -S`
|
|
if _strategy_exists "$inline_strategy"; then
|
|
local strategy_file="$(_get_strategy_file "$inline_strategy")"
|
|
local inline_strategy="$($strategy_file "$pane_full_command" "$dir")"
|
|
fi
|
|
command="$inline_strategy"
|
|
elif _strategy_exists "$pane_full_command"; then
|
|
local strategy_file="$(_get_strategy_file "$pane_full_command")"
|
|
local strategy_command="$($strategy_file "$pane_full_command" "$dir")"
|
|
command="$strategy_command"
|
|
else
|
|
# just invoke the raw command
|
|
command="$pane_full_command"
|
|
fi
|
|
tmux send-keys -t "${session_name}:${window_number}.${pane_index}" "$command" "C-m"
|
|
fi
|
|
}
|
|
|
|
# private functions below
|
|
|
|
_process_should_be_restored() {
|
|
local pane_full_command="$1"
|
|
local session_name="$2"
|
|
local window_number="$3"
|
|
local pane_index="$4"
|
|
if is_pane_registered_as_existing "$session_name" "$window_number" "$pane_index"; then
|
|
# Scenario where pane existed before restoration, so we're not
|
|
# restoring the proces either.
|
|
return 1
|
|
elif ! pane_exists "$session_name" "$window_number" "$pane_index"; then
|
|
# pane number limit exceeded, pane does not exist
|
|
return 1
|
|
elif _restore_all_processes; then
|
|
return 0
|
|
elif _process_on_the_restore_list "$pane_full_command"; then
|
|
return 0
|
|
else
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
_restore_all_processes() {
|
|
local restore_processes="$(get_tmux_option "$restore_processes_option" "$restore_processes")"
|
|
if [ "$restore_processes" == ":all:" ]; then
|
|
return 0
|
|
else
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
_process_on_the_restore_list() {
|
|
local pane_full_command="$1"
|
|
# TODO: make this work without eval
|
|
eval set $(_restore_list)
|
|
local proc
|
|
local match
|
|
for proc in "$@"; do
|
|
match="$(_get_proc_match_element "$proc")"
|
|
if _proc_matches_full_command "$pane_full_command" "$match"; then
|
|
return 0
|
|
fi
|
|
done
|
|
return 1
|
|
}
|
|
|
|
_proc_matches_full_command() {
|
|
local pane_full_command="$1"
|
|
local match="$2"
|
|
if _proc_starts_with_tildae "$match"; then
|
|
match="$(remove_first_char "$match")"
|
|
# regex matching the command makes sure `$match` string is somewhere in the command string
|
|
if [[ "$pane_full_command" =~ ($match) ]]; then
|
|
return 0
|
|
fi
|
|
else
|
|
# regex matching the command makes sure process is a "word"
|
|
if [[ "$pane_full_command" =~ (^${match} ) ]] || [[ "$pane_full_command" =~ (^${match}$) ]]; then
|
|
return 0
|
|
fi
|
|
fi
|
|
return 1
|
|
}
|
|
|
|
_get_proc_match_element() {
|
|
echo "$1" | sed "s/${inline_strategy_token}.*//"
|
|
}
|
|
|
|
_get_proc_restore_element() {
|
|
echo "$1" | sed "s/.*${inline_strategy_token}//"
|
|
}
|
|
|
|
# given full command: 'ruby /Users/john/bin/my_program arg1 arg2'
|
|
# and inline strategy: '~bin/my_program->my_program *'
|
|
# returns: 'arg1 arg2'
|
|
_get_command_arguments() {
|
|
local pane_full_command="$1"
|
|
local match="$2"
|
|
if _proc_starts_with_tildae "$match"; then
|
|
match="$(remove_first_char "$match")"
|
|
fi
|
|
echo "$pane_full_command" | sed "s,^.*${match}[^ ]* *,,"
|
|
}
|
|
|
|
_get_proc_restore_command() {
|
|
local pane_full_command="$1"
|
|
local proc="$2"
|
|
local match="$3"
|
|
local restore_element="$(_get_proc_restore_element "$proc")"
|
|
if [[ "$restore_element" =~ " ${inline_strategy_arguments_token}" ]]; then
|
|
# replaces "%" with command arguments
|
|
local command_arguments="$(_get_command_arguments "$pane_full_command" "$match")"
|
|
echo "$restore_element" | sed "s/${inline_strategy_arguments_token}/${command_arguments}/"
|
|
else
|
|
echo "$restore_element"
|
|
fi
|
|
}
|
|
|
|
_restore_list() {
|
|
local user_processes="$(get_tmux_option "$restore_processes_option" "$restore_processes")"
|
|
local default_processes="$(get_tmux_option "$default_proc_list_option" "$default_proc_list")"
|
|
if [ -z "$user_processes" ]; then
|
|
# user didn't define any processes
|
|
echo "$default_processes"
|
|
else
|
|
echo "$default_processes $user_processes"
|
|
fi
|
|
}
|
|
|
|
_proc_starts_with_tildae() {
|
|
[[ "$1" =~ (^~) ]]
|
|
}
|
|
|
|
_get_inline_strategy() {
|
|
local pane_full_command="$1"
|
|
# TODO: make this work without eval
|
|
eval set $(_restore_list)
|
|
local proc
|
|
local match
|
|
for proc in "$@"; do
|
|
if [[ "$proc" =~ "$inline_strategy_token" ]]; then
|
|
match="$(_get_proc_match_element "$proc")"
|
|
if _proc_matches_full_command "$pane_full_command" "$match"; then
|
|
echo "$(_get_proc_restore_command "$pane_full_command" "$proc" "$match")"
|
|
fi
|
|
fi
|
|
done
|
|
}
|
|
|
|
_strategy_exists() {
|
|
local pane_full_command="$1"
|
|
local strategy="$(_get_command_strategy "$pane_full_command")"
|
|
if [ -n "$strategy" ]; then # strategy set?
|
|
local strategy_file="$(_get_strategy_file "$pane_full_command")"
|
|
[ -e "$strategy_file" ] # strategy file exists?
|
|
else
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
_get_command_strategy() {
|
|
local pane_full_command="$1"
|
|
local command="$(_just_command "$pane_full_command")"
|
|
get_tmux_option "${restore_process_strategy_option}${command}" ""
|
|
}
|
|
|
|
_just_command() {
|
|
echo "$1" | cut -d' ' -f1
|
|
}
|
|
|
|
_get_strategy_file() {
|
|
local pane_full_command="$1"
|
|
local strategy="$(_get_command_strategy "$pane_full_command")"
|
|
local command="$(_just_command "$pane_full_command")"
|
|
echo "$CURRENT_DIR/../strategies/${command}_${strategy}.sh"
|
|
}
|