mirror of
https://github.com/tumillanino/miasma-os.git
synced 2026-04-11 07:15:31 +00:00
182 lines
7.4 KiB
Bash
Executable File
182 lines
7.4 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
|
|
CURRENT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
SCRIPTS_DIR="$CURRENT_DIR/scripts"
|
|
CURRENT="$(tmux display-message -p '#S')"
|
|
|
|
source "$SCRIPTS_DIR/tmuxinator.sh"
|
|
source "$SCRIPTS_DIR/fzf-marks.sh"
|
|
|
|
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"
|
|
}
|
|
|
|
preview_settings() {
|
|
default_window_mode=$(tmux_option_or_fallback "@sessionx-window-mode" "off")
|
|
if [[ "$default_window_mode" == "on" ]]; then
|
|
PREVIEW_OPTIONS="-w"
|
|
fi
|
|
default_window_mode=$(tmux_option_or_fallback "@sessionx-tree-mode" "off")
|
|
if [[ "$default_window_mode" == "on" ]]; then
|
|
PREVIEW_OPTIONS="-t"
|
|
fi
|
|
preview_location=$(tmux_option_or_fallback "@sessionx-preview-location" "top")
|
|
preview_ratio=$(tmux_option_or_fallback "@sessionx-preview-ratio" "75%")
|
|
preview_enabled=$(tmux_option_or_fallback "@sessionx-preview-enabled" "true")
|
|
}
|
|
|
|
window_settings() {
|
|
window_height=$(tmux_option_or_fallback "@sessionx-window-height" "75%")
|
|
window_width=$(tmux_option_or_fallback "@sessionx-window-width" "75%")
|
|
layout_mode=$(tmux_option_or_fallback "@sessionx-layout" "default")
|
|
prompt_icon=$(tmux_option_or_fallback "@sessionx-prompt" " ")
|
|
pointer_icon=$(tmux_option_or_fallback "@sessionx-pointer" "▶")
|
|
}
|
|
|
|
handle_binds() {
|
|
bind_tree_mode=$(tmux_option_or_fallback "@sessionx-bind-tree-mode" "ctrl-t")
|
|
bind_window_mode=$(tmux_option_or_fallback "@sessionx-bind-window-mode" "ctrl-w")
|
|
bind_configuration_mode=$(tmux_option_or_fallback "@sessionx-bind-configuration-path" "ctrl-x")
|
|
bind_rename_session=$(tmux_option_or_fallback "@sessionx-bind-rename-session" "ctrl-r")
|
|
additional_fzf_options=$(tmux_option_or_fallback "@sessionx-additional-options" "--color pointer:9,spinner:92,marker:46")
|
|
|
|
bind_back=$(tmux_option_or_fallback "@sessionx-bind-back" "ctrl-b")
|
|
bind_new_window=$(tmux_option_or_fallback "@sessionx-bind-new-window" "ctrl-e")
|
|
bind_zo=$(tmux_option_or_fallback "@sessionx-bind-zo-new-window" "ctrl-f")
|
|
bind_kill_session=$(tmux_option_or_fallback "@sessionx-bind-kill-session" "alt-bspace")
|
|
|
|
bind_exit=$(tmux_option_or_fallback "@sessionx-bind-abort" "esc")
|
|
bind_accept=$(tmux_option_or_fallback "@sessionx-bind-accept" "enter")
|
|
bind_delete_char=$(tmux_option_or_fallback "@sessionx-bind-delete-char" "bspace")
|
|
|
|
bind_scroll_up=$(tmux_option_or_fallback "@sessionx-bind-scroll-up" "ctrl-u")
|
|
bind_scroll_down=$(tmux_option_or_fallback "@sessionx-bind-scroll-down" "ctrl-d")
|
|
|
|
bind_select_up=$(tmux_option_or_fallback "@sessionx-bind-select-up" "ctrl-p")
|
|
bind_select_down=$(tmux_option_or_fallback "@sessionx-bind-select-down" "ctrl-n")
|
|
|
|
}
|
|
|
|
handle_args() {
|
|
LS_COMMAND=$(tmux_option_or_fallback "@sessionx-ls-command" "ls")
|
|
if [[ "$preview_enabled" == "true" ]]; then
|
|
PREVIEW_LINE="${SCRIPTS_DIR%/}/preview.sh ${PREVIEW_OPTIONS} {}"
|
|
fi
|
|
CONFIGURATION_PATH=$(tmux_option_or_fallback "@sessionx-x-path" "$HOME/.config")
|
|
FZF_BUILTIN_TMUX=$(tmux_option_or_fallback "@sessionx-fzf-builtin-tmux" "off")
|
|
|
|
TREE_MODE="$bind_tree_mode:change-preview(${SCRIPTS_DIR%/}/preview.sh -t {1})"
|
|
CONFIGURATION_MODE="$bind_configuration_mode:reload(find -L $CONFIGURATION_PATH -mindepth 1 -maxdepth 1 -type d -o -type l)+change-preview($LS_COMMAND {})"
|
|
WINDOWS_MODE="$bind_window_mode:reload(tmux list-windows -a -F '#{session_name}:#{window_name}')+change-preview(${SCRIPTS_DIR%/}/preview.sh -w {1})"
|
|
|
|
NEW_WINDOW="$bind_new_window:reload(find -L $PWD -mindepth 1 -maxdepth 1 -type d -o -type l)+change-preview($LS_COMMAND {})"
|
|
ZO_WINDOW="$bind_zo:reload(zoxide query -l)+change-preview($LS_COMMAND {})"
|
|
KILL_SESSION="$bind_kill_session:execute-silent(tmux kill-session -t {1})+reload(${SCRIPTS_DIR%/}/reload_sessions.sh)"
|
|
|
|
ACCEPT="$bind_accept:replace-query+print-query"
|
|
DELETE="$bind_delete_char:backward-delete-char"
|
|
EXIT="$bind_exit:abort"
|
|
|
|
SELECT_UP="$bind_select_up:up"
|
|
SELECT_DOWN="$bind_select_down:down"
|
|
SCROLL_UP="$bind_scroll_up:preview-half-page-up"
|
|
SCROLL_DOWN="$bind_scroll_down:preview-half-page-down"
|
|
|
|
RENAME_SESSION_EXEC='bash -c '\'' printf >&2 "New name: ";read name; tmux rename-session -t {1} "${name}"; '\'''
|
|
RENAME_SESSION_RELOAD='bash -c '\'' tmux list-sessions | sed -E "s/:.*$//"; '\'''
|
|
RENAME_SESSION="$bind_rename_session:execute($RENAME_SESSION_EXEC)+reload($RENAME_SESSION_RELOAD)"
|
|
|
|
HEADER="$bind_accept= $bind_kill_session= $bind_rename_session= $bind_configuration_mode= $bind_window_mode= $bind_new_window= $bind_back= $bind_tree_mode= $bind_scroll_up= $bind_scroll_down= / $bind_zo="
|
|
if is_fzf-marks_enabled; then
|
|
HEADER="$HEADER $(get_fzf-marks_keybind)="
|
|
fi
|
|
|
|
if [[ "$FZF_BUILTIN_TMUX" == "on" ]]; then
|
|
fzf_size_arg="--tmux"
|
|
else
|
|
fzf_size_arg="-p"
|
|
fi
|
|
|
|
args=(
|
|
--ansi
|
|
--bind "$TREE_MODE"
|
|
--bind "$CONFIGURATION_MODE"
|
|
--bind "$WINDOWS_MODE"
|
|
--bind "$NEW_WINDOW"
|
|
--bind "$ZO_WINDOW"
|
|
--bind "$KILL_SESSION"
|
|
--bind "$DELETE"
|
|
--bind "$EXIT"
|
|
--bind "$SELECT_UP"
|
|
--bind "$SELECT_DOWN"
|
|
--bind "$ACCEPT"
|
|
--bind "$SCROLL_UP"
|
|
--bind "$SCROLL_DOWN"
|
|
--bind "$RENAME_SESSION"
|
|
--bind '?:toggle-preview'
|
|
--bind 'change:first'
|
|
--exit-0
|
|
--header="$HEADER"
|
|
--preview="${PREVIEW_LINE}"
|
|
--preview-window="${preview_location},${preview_ratio},,"
|
|
--layout="$layout_mode"
|
|
--pointer="$pointer_icon"
|
|
"${fzf_size_arg}" "$window_width,$window_height"
|
|
--prompt "$prompt_icon"
|
|
--print-query
|
|
--tac
|
|
--scrollbar '▌▐'
|
|
)
|
|
|
|
legacy=$(tmux_option_or_fallback "@sessionx-legacy-fzf-support" "off")
|
|
if [[ "${legacy}" == "off" ]]; then
|
|
args+=(--border-label "Current session: \"$CURRENT\" ")
|
|
args+=(--bind 'focus:transform-preview-label:echo [ {} ] | sed "s/\x1b\[[0-9;]*m//g"')
|
|
fi
|
|
auto_accept=$(tmux_option_or_fallback "@sessionx-auto-accept" "off")
|
|
if [[ "${auto_accept}" == "on" ]]; then
|
|
args+=(--bind one:accept)
|
|
fi
|
|
|
|
if $(is_tmuxinator_enabled); then
|
|
args+=(--bind "$(load_tmuxinator_binding)")
|
|
fi
|
|
if $(is_fzf-marks_enabled); then
|
|
args+=(--bind "$(load_fzf-marks_binding)")
|
|
fi
|
|
|
|
eval "fzf_opts=($additional_fzf_options)"
|
|
}
|
|
|
|
handle_extra_options() {
|
|
# Store each option individually to avoid bash 3.2 associative array issues on macOS
|
|
tmux set-option -g @sessionx-_bind-back "$bind_back"
|
|
tmux set-option -g @sessionx-_filtered-sessions "$(tmux_option_or_fallback "@sessionx-filtered-sessions" "")"
|
|
tmux set-option -g @sessionx-_window-mode "$(tmux_option_or_fallback "@sessionx-window-mode" "off")"
|
|
tmux set-option -g @sessionx-_filter-current "$(tmux_option_or_fallback "@sessionx-filter-current" "true")"
|
|
tmux set-option -g @sessionx-_custom-paths "$(tmux_option_or_fallback "@sessionx-custom-paths" "")"
|
|
tmux set-option -g @sessionx-_custom-paths-subdirectories "$(tmux_option_or_fallback "@sessionx-custom-paths-subdirectories" "false")"
|
|
tmux set-option -g @sessionx-_git-branch "$(tmux_option_or_fallback "@sessionx-git-branch" "off")"
|
|
tmux set-option -g @sessionx-_fzf-builtin-tmux "$FZF_BUILTIN_TMUX"
|
|
}
|
|
|
|
preview_settings
|
|
window_settings
|
|
handle_binds
|
|
handle_args
|
|
handle_extra_options
|
|
|
|
tmux set-option -g @sessionx-_built-args "$(declare -p args)"
|
|
tmux set-option -g @sessionx-_built-fzf-opts "$(declare -p fzf_opts)"
|
|
|
|
if [ `tmux_option_or_fallback "@sessionx-prefix" "on"` = "on" ]; then
|
|
tmux bind-key "$(tmux_option_or_fallback "@sessionx-bind" "O")" run-shell "$CURRENT_DIR/scripts/sessionx.sh"
|
|
else
|
|
tmux bind-key -n "$(tmux_option_or_fallback "@sessionx-bind" "O")" run-shell "$CURRENT_DIR/scripts/sessionx.sh"
|
|
fi
|