home / skills / trentshaines / dotfiles / tmux
/dot_claude/skills/tmux
This skill helps you manage tmux sessions, tmuxinator templates, and sesh switches with streamlined commands and sensible defaults.
npx playbooks add skill trentshaines/dotfiles --skill tmuxReview the files below or copy the command above to add this skill to your agents.
---
name: tmux
description: Help with tmux, tmuxinator, and sesh session management. Use when the user asks about tmux sessions, tmuxinator templates, session switching, or terminal multiplexing.
---
# Tmux Session Management Skill
## Overview
This system uses tmux with tmuxinator templates and sesh for powerful session management.
## Configuration Locations
- **Tmuxinator templates**: `~/.config/tmuxinator/*.yml`
- **Tmux config**: `~/.tmux.conf`
- **Zsh tmux aliases/functions**: `~/.zshrc` (lines 37-72)
- **Active sessions**: Check with `tmux ls` or `sesh list`
## Tmuxinator Templates
### Current Templates
1. **default.yml** - Flexible project template
- Takes directory argument: `tmuxinator start default ~/path`
- Layout: nvim (top 70%), terminal + claude (bottom)
- Dynamic session naming based on directory
2. **admin.yml** - System monitoring
- Fixed name: "admin"
- Layout: btop (left column), 2 terminals (right)
- Purpose: System monitoring and administration
3. **config.yml** - Dotfiles editing
- Fixed name: "config"
- Root: `~/.config`
- Layout: nvim (top 70%), terminal + claude (bottom)
### Template Structure
**CRITICAL: Pane Indexing**
This tmux configuration uses **1-based indexing** (set in `~/.tmux.conf`):
```tmux
set -g base-index 1 # Windows start at 1
set -g pane-base-index 1 # Panes start at 1
```
- First pane = 1, second = 2, third = 3
- Use `prefix + q` (Ctrl+Space then q) to see pane numbers visually
- When targeting panes in commands: `select-pane -t 1` (not -t 0)
**Tmuxinator YAML Structure:**
```yaml
---
name: session-name # Fixed name (or use <%= File.basename(...) %> for dynamic)
root: ~/path # Working directory
on_project_start: tmux resize-pane -t name:0.0 -y 70% # Optional startup commands
windows:
- window-name:
layout: main-horizontal # or main-vertical, tiled, even-horizontal, etc.
panes:
- nvim # Command to run in pane 1
- # empty terminal # Empty pane (interactive shell) - pane 2
- claude --resume # Command for pane 3
```
**Shell Function Structure (for creating windows dynamically):**
```bash
tnw() {
# Get the session's root directory (uses 1-based indexing internally)
local session_path=$(tmux display-message -p '#{session_path}')
tmux new-window -c "$session_path" \; \
split-window -v -c "$session_path" \; \
split-window -v -c "$session_path" \; \
select-layout main-horizontal \; \
select-pane -t 1 \; \
send-keys 'nvim' C-m \; \
select-pane -t 3 \; \
send-keys 'claude --resume' C-m \; \
select-pane -t 2
}
```
**Key points for both:**
- Use `#{session_path}` to get session root directory (not current pane path)
- Pane indexing is 1-based: first pane = 1, not 0
- `send-keys 'command' C-m` executes commands in panes (C-m = Enter)
- `select-pane -t N` focuses pane N (1-based)
- `select-layout` applies tmux built-in layouts
### Common Layouts
- `main-horizontal` - Top pane large, others stacked below
- `main-vertical` - Left pane large, others stacked right
- `tiled` - All panes equal size
- `even-horizontal` - Panes side-by-side equal width
- `even-vertical` - Panes top-to-bottom equal height
## Session Management with `ts` (tmux session selector)
The `ts` function (defined in `~/.zshrc`) is the main session switcher:
```bash
ts # Opens fzf with: "home" + tmuxinator templates + active sessions
```
### How `ts` Works
1. Lists all tmuxinator templates (except default.yml)
2. Adds "home" as an option
3. Shows all active tmux sessions from `sesh list`
4. On selection:
- If session exists → attach with `sesh connect`
- If tmuxinator template exists → `tmuxinator start <template>`
- Otherwise → `tmuxinator start default <name>` (creates new project session)
### Key Insight
Template names come from the **filename** (e.g., `admin.yml` → "admin" in fzf), but the actual tmux session name comes from the `name:` field in the YAML file.
## Tmux Functions & Aliases
From `~/.zshrc`:
### Session Management
```bash
ts # Tmux session selector (fzf for sessions/templates)
tns <name> # Tmux new session - create git project & open with tmuxinator
t [name] # Smart attach/create - attach if exists, create if not
ta <name> # Attach to session
tn <name> # Create new session
tls # List sessions
tk <name> # Kill session
```
### Window Management
```bash
tnw # Tmux new window - create window with 3-pane layout
# Layout: pane 1=nvim, pane 2=terminal (focused), pane 3=claude
# Bound to: prefix + N
```
### Utilities
```bash
tcopy # Copy tmux buffer to clipboard
tlines [n] # Copy last n lines from tmux pane to clipboard
```
## Common Workflows
### Starting Sessions
```bash
ts # Use fzf to select session/template
tns myproject # Create ~/git/myproject with git + tmuxinator
tns myproject config # Use 'config' template instead of default
tmuxinator start admin # Start admin monitoring
tmuxinator start config # Edit dotfiles
tmuxinator start default ~/git/myproject # New project session with default template
```
### Creating Windows
```bash
tnw # Create new window with 3-pane layout in current session
prefix + N # Keybinding for tnw (Ctrl+Space then Shift+N)
prefix + c # Create empty new window (default tmux)
prefix + , # Rename current window
```
### Creating New Templates
1. Create `~/.config/tmuxinator/name.yml`
2. Use existing templates as reference
3. Test with `tmuxinator start name`
4. Now available in `sf` automatically
## Auto-Start Behavior
On terminal startup (from `~/.zshrc:272-275`):
- Creates "home" session if it doesn't exist
- Runs in background (detached)
- Provides a default session to attach to
## Best Practices
1. **Fixed names for utilities**: Use `name: admin` for consistent session names
2. **Dynamic names for projects**: Use `<%= File.basename(...) %>` for project-based naming
3. **Exclude default from sf**: The default template is a fallback, not a session target
4. **Keep layouts simple**: 2-3 panes max for usability
5. **Use comments for empty panes**: `# interactive shell` for clarity
## Troubleshooting
- **Wrong session name**: Check `name:` field in YAML vs filename
- **Template not showing in sf**: Ensure `.yml` extension and not named "default"
- **Layout issues**: Try `tmux kill-session -t name` and restart
- **Pane sizes**: Use `on_project_start` with `tmux resize-pane` commands
This skill helps you manage tmux sessions, tmuxinator templates, and sesh-based session switching. It provides practical guidance for creating, attaching, renaming, and laying out windows and panes so you can keep terminal work organized and reproducible. Use it to automate project sessions, admin dashboards, and developer workflows.
The skill inspects tmuxinator templates (~/.config/tmuxinator/*.yml), tmux configuration (~/.tmux.conf), and active sessions reported by tmux (tmux ls) or sesh (sesh list). It explains how ts (a session selector) combines templates, a 'home' option, and active sessions via fzf to attach or start sessions. It also describes shell helpers (tnw, tns, t, ta, etc.) and the critical 1-based pane indexing used by the configuration.
Why are my pane numbers starting at 1 instead of 0?
The configuration enforces 1-based indexing (base-index and pane-base-index set to 1), so pane targets and scripts use 1 as the first pane.
A template name appears in fzf but the session name is different. Why?
Template filenames show in the selector, but the actual tmux session name comes from the name: field inside the YAML.
How does ts decide to attach or create a session?
ts lists active sessions and templates; selecting an active session attaches via sesh connect, selecting a template starts tmuxinator, otherwise it starts the default template with the chosen name.