mirror of
https://github.com/tumillanino/miasma-os.git
synced 2026-04-11 07:15:31 +00:00
142 lines
3.4 KiB
Bash
Executable File
142 lines
3.4 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# Display preview of tmux windows/panes.
|
|
# Meant for use in fzf preview.
|
|
# Kudos:
|
|
# https://stackoverflow.com/a/55247572/197789
|
|
# https://github.com/petobens/dotfiles/blob/master/tmux/tmux_tree
|
|
|
|
single_mode() {
|
|
# check if it's a custom directory
|
|
if test -d "${1}"; then
|
|
display_directory "${1}"
|
|
return
|
|
fi
|
|
|
|
session_name="${1}"
|
|
if test "${DISPLAY_TMUXP}" -eq 1; then
|
|
if $(tmux has-session -t "${session_name}" >&/dev/null); then
|
|
:
|
|
else
|
|
tmuxp_conf="${HOME}/.tmuxp/${session_name}.yaml"
|
|
if test -e "${tmuxp_conf}"; then
|
|
cat "${tmuxp_conf}"
|
|
return
|
|
fi
|
|
fi
|
|
fi
|
|
display_session "${session_name}"
|
|
}
|
|
|
|
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"
|
|
}
|
|
|
|
# Display a directory using the configured ls command
|
|
display_directory() {
|
|
directory_name="${1}"
|
|
ls_command=$(tmux_option_or_fallback "@sessionx-ls-command" "ls")
|
|
eval "${ls_command} ${directory_name}"
|
|
}
|
|
|
|
# Display a single sesssion
|
|
display_session() {
|
|
session_name="${1}"
|
|
session_id=$(tmux ls -F '#{session_id}' -f "#{==:#{session_name},${session_name}}")
|
|
if test -z "${session_id}"; then
|
|
return 1
|
|
fi
|
|
tmux capture-pane -ep -t "${session_id}"
|
|
}
|
|
|
|
window_mode() {
|
|
args=($1)
|
|
tmux capture-pane -ep -t "${args[0]}"
|
|
}
|
|
|
|
# Display a full tree, with selected session highlighted.
|
|
# If an session name is passed as an argument, highlight it
|
|
# in the output.
|
|
# This is the original tmux_tree script (see kudos).
|
|
tree_mode() {
|
|
highlight="${1}"
|
|
icon=$(tmux_option_or_fallback "@sessionx-tree-icon" "")
|
|
tmux ls -F'#{session_id}' | while read -r s; do
|
|
S=$(tmux ls -F'#{session_id}#{session_name}: #{T:tree_mode_format}' | grep ^"$s")
|
|
session_info=${S##$s}
|
|
session_name=$(echo "$session_info" | cut -d ':' -f 1)
|
|
if [[ -n "$highlight" ]] && [[ "$highlight" == "$session_name" ]]; then
|
|
echo -e "\033[1;34m$session_info\033[0m"
|
|
else
|
|
echo -e "\033[1m$session_info\033[0m"
|
|
fi
|
|
# Display each window
|
|
tmux lsw -t"$s" -F'#{window_id}' | while read -r w; do
|
|
W=$(tmux lsw -t"$s" -F'#{window_id}#{T:tree_mode_format}' | grep ^"$w")
|
|
echo " $icon ${W##$w}"
|
|
done
|
|
done
|
|
}
|
|
|
|
usage() {
|
|
cat <<-END
|
|
Usage: $0 [<options>] [<session_name>]
|
|
|
|
Options:
|
|
-h Print help and exit.
|
|
-p Display tmuxp configuration is session not running
|
|
-t Display tree of sessions
|
|
|
|
A session name of "*Last*" is replaced with the client's last session.
|
|
END
|
|
# Note 'END' above most be fully left justified.
|
|
}
|
|
|
|
# What are we displaying?
|
|
# 'tree' == full tree of active sessions
|
|
# 'single' == single session
|
|
mode="single"
|
|
|
|
# In single mode, if session is not running, display
|
|
# tmuxp configuration instead (if it exists)
|
|
DISPLAY_TMUXP=0
|
|
|
|
while getopts ":hptw" opt; do
|
|
case $opt in
|
|
h)
|
|
usage
|
|
exit 0
|
|
;;
|
|
p) DISPLAY_TMUXP=1 ;;
|
|
t) mode="tree" ;;
|
|
w) mode="window" ;;
|
|
\?) echo "Invalid option: -$OPTARG" >&2 ;;
|
|
esac
|
|
done
|
|
|
|
shift $(($OPTIND - 1))
|
|
CURRENT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
source "$CURRENT_DIR/git-branch.sh"
|
|
SESSION=$(strip_git_branch_info "$1")
|
|
|
|
if test "${SESSION}" == '*Last*'; then
|
|
SESSION=$(tmux display-message -p "#{client_last_session}")
|
|
if test -z "${SESSION}"; then
|
|
echo "No last session."
|
|
exit 0
|
|
fi
|
|
fi
|
|
|
|
case "${mode}" in
|
|
single) single_mode "${SESSION}" ;;
|
|
tree) tree_mode "${SESSION}" ;;
|
|
window) window_mode "${SESSION}" ;;
|
|
*) echo "Unknown mode \"${mode}\"" ;;
|
|
esac
|
|
|
|
exit $status
|