# Tmuxifier Session Templates This directory contains reusable tmux session and window layouts managed by [tmuxifier](https://github.com/jimeh/tmuxifier). ## Installation ### 1. Install tmuxifier ```bash git clone https://github.com/jimeh/tmuxifier.git ~/.tmuxifier ``` ### 2. Add to tmux (via TPM) The `tmux.conf` in this directory already includes the tmuxifier plugin. After starting tmux, press `prefix + I` to install it via TPM. ### 3. Add to your shell The fish config (`~/.config/fish/config.fish`) in this repo already includes tmuxifier initialization. Restart fish or run: ```fish source ~/.config/fish/config.fish ``` ### 4. Verify installation ```fish which tmuxifier # Should output: ~/.tmuxifier/bin/tmuxifier tmuxifier help # Should show tmuxifier commands ``` ## Quick Start After installing tmuxifier, create and load sessions: ```bash # Create a new session layout tmuxifier new-session my-project # Load a session tmuxifier load-session my-project # or: t s my-project # Edit an existing session tmuxifier edit-session my-project # or: t es my-project # Create a window layout (for use within existing sessions) tmuxifier new-window my-window tmuxifier load-window my-window # or: t lw my-window ``` ## Directory Structure ``` tmuxifier/ ├── layouts/ │ ├── *.session.sh # Full session definitions │ └── *.window.sh # Window-only definitions ``` ## Session Template Reference ### Basic Structure ```bash # Set a custom session root path (must be called before initialize_session) session_root "~/projects/my-project" # Create session with specified name if it does not already exist if initialize_session "my-project"; then # Create windows new_window "editor" new_window "server" new_window "logs" # Select the default active window select_window "editor" # Run commands in the selected window run_cmd "cd ~/projects/my-project" # Send keys (like typing) to the pane send_keys "nvim ." C-m # Finalize session creation and switch/attach to it finalize_and_go_to_session fi ``` ### Commands Reference #### Session Commands | Command | Description | |---------|-------------| | `session_root "path"` | Set root directory for session (must be first) | | `initialize_session "name"` | Create session if it doesn't exist | | `finalize_and_go_to_session` | Complete creation and attach to session | | `select_window "name"` | Set active window | #### Window Commands | Command | Description | |---------|-------------| | `new_window "name"` | Create a new window | | `select_window "name"` | Switch to existing window | | `run_cmd "command"` | Execute command in current pane | | `send_keys "keys"` | Send key sequence to pane | | `send_text "text"` | Send raw text to pane | | `split_h [percent]` | Horizontal split (default 50%) | | `split_v [percent]` | Vertical split (default 50%) | | `select_pane [target]` | Select pane (up, down, left, right, left-or-up, right-or-down) | #### Pane Target Options For `select_pane`: - `up`, `down`, `left`, `right` - Navigate to adjacent pane - `left-or-up`, `right-or-down` - Prefer first direction, fall back to second ### Key Modifiers | Symbol | Meaning | |--------|---------| | `C-m` | Enter/Return key | | `C-c` | Ctrl+C | | `C-d` | Ctrl+D (EOF) | | `M-m` | Alt/Meta+m | | `C-\\` | Ctrl+\\ | ## Example Templates Understanding the pane system is key. Here's a visual breakdown: ``` ┌─────────────────────────────────────────────────────┐ │ Window: "editor" │ │ ┌─────────────────────┬───────────────────────────┐ │ │ │ Pane 1 (40%) │ Pane 2 (60%) │ │ │ │ nvim │ npm run dev │ │ │ │ ├───────────────────────────┤ │ │ │ │ Pane 3 (50% of pane 2) │ │ │ │ │ npm run test │ │ │ └─────────────────────┴───────────────────────────┘ │ └─────────────────────────────────────────────────────┘ ``` ### Example 1: Two Panes Side by Side ```bash session_root "~/projects/app" if initialize_session "app"; then new_window "editor" # Split horizontally (40% left, 60% right) split_h 40 # Run command in first pane (left side) run_cmd "cd ~/projects/app && nvim" # Move to second pane (right side) and split vertically select_pane right split_v 50 # Run commands in the new panes run_cmd "npm run dev" select_pane right run_cmd "npm run test" select_window "editor" finalize_and_go_to_session fi ``` ### Example 2: Three Panes with Nested Split ```bash session_root "~/projects/app" if initialize_session "app"; then new_window "editor" # Create three panes: top (20%), bottom-left (40%), bottom-right (40%) split_v 20 # horizontal split at 20% run_cmd "htop" # top pane: system monitor select_pane down # move to bottom split_h 50 # vertical split bottom into left/right run_cmd "npm run dev" # bottom-left select_pane right run_cmd "npm run test" # bottom-right select_window "editor" finalize_and_go_to_session fi ``` ``` Resulting layout: ┌─────────────────────────────────────┐ │ htop (20%) │ ├──────────────┬──────────────────────┤ │ npm run dev │ npm run test │ │ (40%) │ (40%) │ └──────────────┴──────────────────────┘ ``` ### Example 3: Multiple Windows with Panes ```bash session_root "~/projects/webapp" if initialize_session "webapp"; then # Window 1: Main workspace with panes new_window "editor" split_h 50 run_cmd "cd ~/projects/webapp && nvim" select_pane right run_cmd "cd ~/projects/webapp && npm run dev" # Window 2: Server with logs new_window "server" split_v 30 run_cmd "cd ~/projects/webapp && python -m http.server 8000" select_pane right run_cmd "cd ~/projects/webapp && tail -f logs/app.log" # Window 3: Database new_window "database" run_cmd "docker compose up db" # Start on editor window select_window "editor" finalize_and_go_to_session fi ``` ### Example 4: Practical Development Setup ```bash session_root "~/projects/api" if initialize_session "api"; then new_window "code" split_h 60 run_cmd "cd ~/projects/api && nvim" select_pane right split_v 50 run_cmd "cd ~/projects/api && uvicorn main:app --reload" select_pane right run_cmd "cd ~/projects/api && tail -f logs/api.log" new_window "tests" split_h 50 run_cmd "cd ~/projects/api && pytest -v" select_pane right run_cmd "cd ~/projects/api && pytest --cov" new_window "shell" run_cmd "cd ~/projects/api" select_window "code" finalize_and_go_to_session fi ``` ### Example 5: Simple Window Layout (No Panes) ```bash session_root "~/projects/webapp" if initialize_session "webapp"; then # Each window has a single pane new_window "editor" run_cmd "cd ~/projects/webapp && nvim" new_window "server" run_cmd "cd ~/projects/webapp && npm run dev" new_window "database" run_cmd "docker compose up db" new_window "logs" run_cmd "cd ~/projects/webapp && tail -f logs/app.log" select_window "editor" finalize_and_go_to_session fi ``` ## Shell Integration ### Aliases Add these to your shell config for convenience: ```bash # Bash/Zsh (.bashrc or .zshrc) alias t='tmuxifier' alias ts='tmuxifier load-session' alias tes='tmuxifier edit-session' alias tns='tmuxifier new-session' alias tlw='tmuxifier load-window' # Fish (.config/fish/config.fish or conf.d/) alias t 'tmuxifier' alias ts 'tmuxifier load-session' alias tes 'tmuxifier edit-session' ``` ### Usage Without Tmux Prefix If you want to load sessions from outside tmux (in a regular terminal): ```bash # Run this in a plain terminal, NOT inside tmux tmuxifier load-session my-project ``` ## Tips 1. **Exit before loading**: Make sure you're not inside tmux when running `load-session` 2. **Auto-starting services**: Use `run_cmd` with background processes (`&`) for long-running services 3. **Docker containers**: Commands like `docker compose up -d` work well in dedicated windows 4. **Custom layouts path**: Set `TMUXIFIER_LAYOUT_PATH` to use a different directory ```bash export TMUXIFIER_LAYOUT_PATH="$HOME/.config/tmux/layouts" ``` ## Troubleshooting **"unknown command" when running tmuxifier?** - tmuxifier is not installed. Run: `git clone https://github.com/jimeh/tmuxifier.git ~/.tmuxifier` - Restart your shell: `source ~/.config/fish/config.fish` - Verify: `which tmuxifier` **Session won't load?** - Make sure you're NOT inside tmux when running `load-session` - Make sure tmuxifier is initialized in your shell config - Check that you have tmux installed: `tmux -V` - Verify the layout file exists: `ls ~/.tmuxifier/layouts/` **TPM plugin not working?** - Inside tmux, press `prefix + I` (capital I) to install plugins - `prefix` is `Ctrl+Space` by default in this config **Commands not running?** - Use `run_cmd` for single commands, not `send_keys` - For interactive commands, consider using `send_keys` instead