#!/usr/bin/env bash CURRENT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" CURRENT="$(tmux display-message -p '#S')" Z_MODE="off" source "$CURRENT_DIR/tmuxinator.sh" source "$CURRENT_DIR/fzf-marks.sh" source "$CURRENT_DIR/git-branch.sh" get_sorted_sessions() { last_session=$(tmux display-message -p '#{client_last_session}') sessions=$(tmux list-sessions | sed -E 's/:.*$//' | grep -Fxv "$last_session") filtered_sessions=$(tmux show-option -gqv @sessionx-_filtered-sessions) if [[ -n "$filtered_sessions" ]]; then filtered_and_piped=$(echo "$filtered_sessions" | sed -E 's/,/|/g') sessions=$(echo "$sessions" | grep -Ev "$filtered_and_piped") fi local sorted sorted=$(echo -e "$sessions\n$last_session" | awk '!seen[$0]++') echo "$sorted" } tmux_option_or_fallback() { local option_value option_value="$(tmux show-option -gqv "$1")" if [ -z "$option_value" ]; then option_value="$2" fi echo "$option_value" } input() { default_window_mode=$(tmux show-option -gqv @sessionx-_window-mode) if [[ "$default_window_mode" == "on" ]]; then tmux list-windows -a -F '#{session_name}:#{window_index} #{window_name}' else filter_current_session=$(tmux show-option -gqv @sessionx-_filter-current) if [[ "$filter_current_session" == "true" ]]; then (get_sorted_sessions | grep -Fxv "$CURRENT") || echo "$CURRENT" else (get_sorted_sessions) || echo "$CURRENT" fi fi } additional_input() { sessions=$(get_sorted_sessions) custom_paths=$(tmux show-option -gqv @sessionx-_custom-paths) custom_path_subdirectories=$(tmux show-option -gqv @sessionx-_custom-paths-subdirectories) if [[ -z "$custom_paths" ]]; then echo "" else clean_paths=$(echo "$custom_paths" | sed -E 's/ *, */,/g' | sed -E 's/^ *//' | sed -E 's/ *$//' | sed -E 's/ /✗/g') if [[ "$custom_path_subdirectories" == "true" ]]; then paths=$(find ${clean_paths//,/ } -mindepth 1 -maxdepth 1 -type d) else paths=${clean_paths//,/ } fi add_path() { local path=$1 if ! grep -q "$(basename "$path")" <<< "$sessions"; then echo "$path" fi } export -f add_path printf "%s\n" "${paths//,/$IFS}" | xargs -n 1 -P 0 bash -c 'add_path "$@"' _ fi } handle_output() { set -- "$(strip_git_branch_info "$*")" if [ -d "$*" ]; then # No special handling because there isn't a window number or window name present # except in unlikely and contrived situations (e.g. # "/home/person/projects:0\ bash" could be a path on your filesystem.) target=$(echo "$@" | tr -d '\n') elif is_fzf-marks_mark "$@" ; then # Needs to run before session name mode mark=$(get_fzf-marks_mark "$@") target=$(get_fzf-marks_target "$@") elif echo "$@" | grep ':' >/dev/null 2>&1; then # Colon probably delimits session name and window number session_name=$(echo "$@" | cut -d: -f1) num=$(echo "$@" | cut -d: -f2 | cut -d' ' -f1) target=$(echo "${session_name}:${num}" | tr -d '\n') else # All tokens represent a session name target=$(echo "$@" | tr -d '\n') fi if [[ -z "$target" ]]; then exit 0 fi if ! tmux has-session -t="$target" 2>/dev/null; then if is_tmuxinator_enabled && is_tmuxinator_template "$target"; then tmuxinator start "$target" elif test -n "$mark"; then tmux new-session -ds "$mark" -c "$target" target="$mark" elif test -d "$target"; then d_target="$(basename "$target" | tr -d '.')" tmux new-session -ds $d_target -c "$target" target=$d_target else if [[ "$Z_MODE" == "on" ]]; then z_target=$(zoxide query "$target") tmux new-session -ds "$target" -c "$z_target" -n "$z_target" else tmux new-session -ds "$target" fi fi fi tmux switch-client -t "$target" exit 0 } handle_input() { INPUT=$(input) ADDITIONAL_INPUT=$(additional_input) if [[ -n $ADDITIONAL_INPUT ]]; then INPUT="$(additional_input)\n$INPUT" fi bind_back=$(tmux show-option -gqv @sessionx-_bind-back) git_branch_mode=$(tmux show-option -gqv @sessionx-_git-branch) if [[ "$git_branch_mode" == "on" ]]; then BACK="$bind_back:reload(${CURRENT_DIR}/sessions_with_branches.sh)+change-preview(${CURRENT_DIR}/preview.sh {1})" else BACK="$bind_back:reload(echo -e \"${INPUT// /}\")+change-preview(${CURRENT_DIR}/preview.sh {1})" fi } run_plugin() { Z_MODE=$(tmux_option_or_fallback "@sessionx-zoxide-mode" "off") eval $(tmux show-option -gqv @sessionx-_built-args) eval $(tmux show-option -gqv @sessionx-_built-fzf-opts) handle_input args+=(--bind "$BACK") git_branch_mode=$(tmux show-option -gqv @sessionx-_git-branch) if [[ "$git_branch_mode" == "on" ]]; then FZF_LISTEN_PORT=$((RANDOM % 10000 + 20000)) args+=(--listen "localhost:$FZF_LISTEN_PORT") args+=(--tiebreak=begin) "${CURRENT_DIR}/sessions_with_branches.sh" "$FZF_LISTEN_PORT" & fi FZF_BUILTIN_TMUX=$(tmux show-option -gqv @sessionx-_fzf-builtin-tmux) if [[ "$FZF_BUILTIN_TMUX" == "on" ]]; then RESULT=$(echo -e "${INPUT}" | sed -E 's/✗/ /g' | fzf "${fzf_opts[@]}" "${args[@]}" | tail -n1) else RESULT=$(echo -e "${INPUT}" | sed -E 's/✗/ /g' | fzf-tmux "${fzf_opts[@]}" "${args[@]}" | tail -n1) fi } run_plugin handle_output "$RESULT"