tmux-resurrect/docs/restoring_bash_history.md

1.6 KiB

tmux-ressurect no longer restores shell history for each pane, as of this PR.

As a workaround, you can use the HISTFILE environment variable to preserve history for each pane separately, and modify PROMPT_COMMAND to make sure history gets saved with each new command.

Unfortunately, we haven't found a perfect way of getting a unique identifier for each pane, as the TMUX_PANE variable seems to occasionally change when resurrecting. As a workaround, the example below sets a unique ID in each pane's title. The downside of this implementation is that pane titles must all be unique across sessions/windows, and also must use the pane_id_prefix.

Any improvements/suggestions for getting a unique, persistent ID for each pane are welcome!

pane_id_prefix="resurrect_"

# Create history directory if it doesn't exist
HISTS_DIR=$HOME/.bash_history.d
mkdir -p "${HISTS_DIR}"

if [ -n "${TMUX_PANE}" ]; then

  # Check if we've already set this pane title
  pane_id=$(tmux display -pt "${TMUX_PANE:?}" "#{pane_title}")
  if [[ $pane_id != "$pane_id_prefix"* ]]; then

    # if not, set it to a random ID
    random_id=$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 16)
    printf "\033]2;$pane_id_prefix$random_id\033\\"
    pane_id=$(tmux display -pt "${TMUX_PANE:?}" "#{pane_title}")
  fi

  # use the pane's random ID for the HISTFILE
  export HISTFILE="${HISTS_DIR}/bash_history_tmux_${pane_id}"
else
  export HISTFILE="${HISTS_DIR}/bash_history_no_tmux"
fi

# Stash the new history each time a command runs.
export PROMPT_COMMAND="$PROMPT_COMMAND;history -a"