Files
dot-config-folder/tmux/tmux-fzf-menu.sh
Jens Luedicke 8e563fec51 Add session manager for tmux.
This will open a tmux session for each monitor.
Add helper script for tmux actions.
2025-09-22 15:26:42 +02:00

193 lines
6.0 KiB
Bash
Executable File

#!/bin/bash
# Advanced tmux operations menu using fzf
# Provides a unified interface for various tmux operations
# Colors for output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# Main menu options
show_menu() {
echo "Session: Switch to session"
echo "Window: Switch to window"
echo "Move Window: Move current window to another session"
echo "Move Pane: Move current pane to another window"
echo "Swap Window: Swap current window with another"
echo "Rename Window: Rename current window"
echo "Rename Session: Rename current session"
echo "Kill Window: Kill a window"
echo "Kill Session: Kill a session"
echo "New Session: Create new session"
echo "Link Window: Link window from another session"
echo "Unlink Window: Unlink current window"
}
# Function to switch session
switch_session() {
tmux list-sessions -F '#{session_name}: #{session_windows} windows#{?session_attached, (attached),}' | \
fzf --header='Switch to session:' \
--preview='tmux list-windows -t {1} -F "#{window_index}: #{window_name} [#{window_panes} panes]"' | \
cut -d: -f1 | \
xargs -I {} tmux switch-client -t {}
}
# Function to switch window
switch_window() {
tmux list-windows -a -F '#{session_name}:#{window_index}: #{window_name}' | \
fzf --header='Switch to window:' \
--preview='tmux list-panes -t {1} -F "Pane #{pane_index}: #{pane_current_command}"' | \
cut -d: -f1,2 | \
xargs -I {} tmux switch-client -t {}
}
# Function to move current window
move_window() {
current_window=$(tmux display-message -p '#W')
target=$(tmux list-sessions -F '#{session_name}' | \
fzf --header="Move window '${current_window}' to session:" \
--preview='tmux list-windows -t {} -F "#{window_index}: #{window_name}"')
if [ ! -z "$target" ]; then
tmux move-window -t "${target}:"
tmux switch-client -t "$target"
fi
}
# Function to move current pane
move_pane() {
target=$(tmux list-windows -a -F '#{session_name}:#{window_index}: #{window_name}' | \
fzf --header='Move pane to window:' \
--preview='tmux list-panes -t {1} -F "Pane #{pane_index}: #{pane_current_command}"')
if [ ! -z "$target" ]; then
window_target=$(echo "$target" | cut -d: -f1,2)
tmux join-pane -t "$window_target"
fi
}
# Function to swap windows
swap_window() {
target=$(tmux list-windows -F '#{window_index}: #{window_name}' | \
fzf --header='Swap current window with:')
if [ ! -z "$target" ]; then
window_idx=$(echo "$target" | cut -d: -f1)
tmux swap-window -t "$window_idx"
fi
}
# Function to rename window
rename_window() {
echo -n "New window name: "
read -r new_name
if [ ! -z "$new_name" ]; then
tmux rename-window "$new_name"
fi
}
# Function to rename session
rename_session() {
echo -n "New session name: "
read -r new_name
if [ ! -z "$new_name" ]; then
tmux rename-session "$new_name"
fi
}
# Function to kill window
kill_window() {
target=$(tmux list-windows -a -F '#{session_name}:#{window_index}: #{window_name}' | \
fzf --header='Kill window:' --multi \
--preview='tmux list-panes -t {1} -F "Pane #{pane_index}: #{pane_current_command}"')
if [ ! -z "$target" ]; then
echo "$target" | while IFS= read -r window; do
window_target=$(echo "$window" | cut -d: -f1,2)
tmux kill-window -t "$window_target"
done
fi
}
# Function to kill session
kill_session() {
target=$(tmux list-sessions -F '#{session_name}: #{session_windows} windows#{?session_attached, (attached),}' | \
fzf --header='Kill session:' --multi \
--preview='tmux list-windows -t {1} -F "#{window_index}: #{window_name}"')
if [ ! -z "$target" ]; then
echo "$target" | while IFS= read -r session; do
session_name=$(echo "$session" | cut -d: -f1)
tmux kill-session -t "$session_name"
done
fi
}
# Function to create new session
new_session() {
echo -n "New session name: "
read -r session_name
if [ ! -z "$session_name" ]; then
tmux new-session -d -s "$session_name"
tmux switch-client -t "$session_name"
fi
}
# Function to link window from another session
link_window() {
target=$(tmux list-windows -a -F '#{session_name}:#{window_index}: #{window_name}' | \
fzf --header='Link window:' \
--preview='tmux list-panes -t {1} -F "Pane #{pane_index}: #{pane_current_command}"')
if [ ! -z "$target" ]; then
source_window=$(echo "$target" | cut -d' ' -f1)
tmux link-window -s "$source_window"
fi
}
# Function to unlink current window
unlink_window() {
tmux unlink-window
echo "Current window unlinked"
}
# Main execution
if [ "$1" == "--menu" ] || [ -z "$1" ]; then
# Show interactive menu
selection=$(show_menu | fzf --header='Tmux Operations:' | cut -d: -f1)
case "$selection" in
"Session") switch_session ;;
"Window") switch_window ;;
"Move Window") move_window ;;
"Move Pane") move_pane ;;
"Swap Window") swap_window ;;
"Rename Window") rename_window ;;
"Rename Session") rename_session ;;
"Kill Window") kill_window ;;
"Kill Session") kill_session ;;
"New Session") new_session ;;
"Link Window") link_window ;;
"Unlink Window") unlink_window ;;
esac
else
# Direct command execution
case "$1" in
session) switch_session ;;
window) switch_window ;;
move-window) move_window ;;
move-pane) move_pane ;;
swap-window) swap_window ;;
rename-window) rename_window ;;
rename-session) rename_session ;;
kill-window) kill_window ;;
kill-session) kill_session ;;
new-session) new_session ;;
link-window) link_window ;;
unlink-window) unlink_window ;;
*) echo "Unknown command: $1" ;;
esac
fi