diff --git a/zsh/functions/_op_common.zsh b/zsh/functions/_op_common.zsh index b3de0a3..67d0a0e 100644 --- a/zsh/functions/_op_common.zsh +++ b/zsh/functions/_op_common.zsh @@ -51,6 +51,7 @@ _op_run() { history sessions logs + skill ) local name @@ -104,9 +105,35 @@ _op_run() { fi fi - OPENCODE_CONFIG_DIR="$tmp_home" "${opencode_cmd[@]}" + local explicit_session="" + local i + for (( i=1; i<=${#opencode_cmd[@]}; i++ )); do + case "${opencode_cmd[$i]}" in + -s|--session) explicit_session="${opencode_cmd[$((i+1))]}"; break ;; + -s=*|--session=*) explicit_session="${opencode_cmd[$i]#*=}"; break ;; + esac + done + + OPENCODE_CONFIG_DIR="$tmp_home" \ + RIPGREP_CONFIG_PATH="${RIPGREP_CONFIG_PATH:-$HOME/.ripgreprc}" \ + "${opencode_cmd[@]}" local exit_code=$? + local session_to_save="" + if [ -n "$explicit_session" ]; then + session_to_save="$explicit_session" + else + session_to_save=$(OPENCODE_CONFIG_DIR="$tmp_home" opencode session list 2>/dev/null | awk 'NR==3{print $1}') + fi + + if [ -n "$session_to_save" ] && [ -n "$TMUX" ]; then + local win_key + win_key=$(tmux display-message -p '#{session_name}:#{window_name}') + local state_dir="${XDG_STATE_HOME:-$HOME/.local/state}/op" + mkdir -p "$state_dir" + printf '%s\n%s\n' "$session_to_save" "$tag" > "$state_dir/window_${win_key//[^a-zA-Z0-9_]/_}" + fi + trap - EXIT INT TERM eval "$cleanup_cmd" return $exit_code diff --git a/zsh/functions/opr.zsh b/zsh/functions/opr.zsh new file mode 100644 index 0000000..6fd0219 --- /dev/null +++ b/zsh/functions/opr.zsh @@ -0,0 +1,42 @@ +opr() { + if [ -z "$TMUX" ]; then + print -u2 "opr: not in tmux" + return 1 + fi + + local win_key + win_key=$(tmux display-message -p '#{session_name}:#{window_name}') + local state_file="${XDG_STATE_HOME:-$HOME/.local/state}/op/window_${win_key//[^a-zA-Z0-9_]/_}" + + if [ ! -f "$state_file" ]; then + print -u2 "opr: no previous session for this tmux window" + return 1 + fi + + local session_id tag + { read -r session_id; read -r tag; } < "$state_file" + + if [ -z "$session_id" ]; then + print -u2 "opr: no previous session to resume" + return 1 + fi + + tag="${tag:-op}" + print -u2 "opr: resuming session $session_id" + + if ! typeset -f _op_run >/dev/null; then + local src=${funcfiletrace[1]%:*} + local dir=${src:h} + local common="$dir/_op_common.zsh" + if [ ! -f "$common" ]; then + common="${XDG_CONFIG_HOME:-$HOME/.config}/zsh/functions/_op_common.zsh" + fi + if [ ! -f "$common" ]; then + print -u2 "opr: missing _op_common.zsh at $common" + return 1 + fi + source "$common" || return 1 + fi + + _op_run "$tag" --session "$session_id" "$@" +} diff --git a/zsh/zshrc b/zsh/zshrc index 93156b9..cdc16e6 100644 --- a/zsh/zshrc +++ b/zsh/zshrc @@ -18,5 +18,6 @@ source ~/.config/zsh/functions/cd_git_root.zsh source ~/.config/zsh/functions/co.zsh source ~/.config/zsh/functions/op.zsh +source ~/.config/zsh/functions/opr.zsh source ~/.config/zsh/functions/se.zsh