initial commit: tmux cheat sheet alfred workflow
Some checks failed
Build Workflow / build (push) Failing after 6s
Some checks failed
Build Workflow / build (push) Failing after 6s
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
30
.gitea/workflows/build.yml
Normal file
30
.gitea/workflows/build.yml
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
name: Build Workflow
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: [main]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Run tests
|
||||||
|
run: bash tests/test_tmux_search.sh
|
||||||
|
|
||||||
|
- name: Build .alfredworkflow
|
||||||
|
run: bash build/build_workflow.sh
|
||||||
|
|
||||||
|
- name: Extract version
|
||||||
|
id: version
|
||||||
|
run: |
|
||||||
|
VERSION=$(grep -A1 '<key>version</key>' info.plist | grep '<string>' | sed 's/.*<string>//;s/<\/string>.*//')
|
||||||
|
echo "version=${VERSION}" >> "$GITHUB_OUTPUT"
|
||||||
|
|
||||||
|
- name: Create release
|
||||||
|
uses: softprops/action-gh-release@v2
|
||||||
|
with:
|
||||||
|
tag_name: v${{ steps.version.outputs.version }}
|
||||||
|
name: v${{ steps.version.outputs.version }}
|
||||||
|
files: dist/alfred-tmux-cheat-sheet.alfredworkflow
|
||||||
3
.gitignore
vendored
Normal file
3
.gitignore
vendored
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
dist/
|
||||||
|
.DS_Store
|
||||||
|
.claude/
|
||||||
41
README.md
Normal file
41
README.md
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
# tmux Cheat Sheet (Alfred Workflow)
|
||||||
|
|
||||||
|
Quickly look up tmux commands, key bindings, and practical examples directly from Alfred.
|
||||||
|
|
||||||
|
## Install
|
||||||
|
|
||||||
|
Download `alfred-tmux-cheat-sheet.alfredworkflow` from the [latest release](https://git.felixfoertsch.de/felixfoertsch/alfred-tmux-cheat-sheet/releases/latest) and open it — Alfred imports it automatically.
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
1. Open Alfred and type `tmux` followed by your query.
|
||||||
|
2. Results are ranked by how commonly they are needed.
|
||||||
|
3. Press **Enter** to copy the result to clipboard.
|
||||||
|
4. Press **Cmd+L** for a large type view.
|
||||||
|
|
||||||
|
### Examples
|
||||||
|
|
||||||
|
| Query | Finds |
|
||||||
|
|---|---|
|
||||||
|
| `tmux new session name` | `tmux new -s mysession` |
|
||||||
|
| `tmux split` | Key bindings (Ctrl+b %, Ctrl+b ") and commands |
|
||||||
|
| `tmux attach` | All ways to attach to a session |
|
||||||
|
| `tmux copy` | Copy mode shortcuts and buffer commands |
|
||||||
|
| `tmux mouse` | `tmux set -g mouse on` |
|
||||||
|
|
||||||
|
## Configuration
|
||||||
|
|
||||||
|
Open **Alfred → Workflows → tmux Cheat Sheet → Configure Workflow** to change the prefix key (default: `Ctrl+b`).
|
||||||
|
|
||||||
|
## Development
|
||||||
|
|
||||||
|
**Data sources:**
|
||||||
|
- **Key bindings** are parsed from your local `man tmux` via `bash scripts/parse_manual.sh`.
|
||||||
|
- **Practical examples** are curated in `data/examples.tsv` — add your own by appending a line: `command-name\tdescription\ttmux command`.
|
||||||
|
- **Tier ordering** controls result priority in `data/tiers.tsv` (1 = essential, 4 = rare).
|
||||||
|
|
||||||
|
**Regenerate** the cheat sheet after a tmux update: `bash scripts/parse_manual.sh`
|
||||||
|
|
||||||
|
**Run tests:** `bash tests/test_tmux_search.sh`
|
||||||
|
|
||||||
|
**Build locally:** `bash build/build_workflow.sh`
|
||||||
22
build/build_workflow.sh
Executable file
22
build/build_workflow.sh
Executable file
@@ -0,0 +1,22 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
||||||
|
OUT_DIR="${ROOT_DIR}/dist"
|
||||||
|
STAGE_DIR="${OUT_DIR}/tmux-workflow"
|
||||||
|
WORKFLOW_FILE="${OUT_DIR}/alfred-tmux-cheat-sheet.alfredworkflow"
|
||||||
|
|
||||||
|
rm -rf "${STAGE_DIR}"
|
||||||
|
mkdir -p "${STAGE_DIR}" "${OUT_DIR}"
|
||||||
|
|
||||||
|
cp "${ROOT_DIR}/info.plist" "${STAGE_DIR}/"
|
||||||
|
cp "${ROOT_DIR}/icon.png" "${STAGE_DIR}/"
|
||||||
|
cp -R "${ROOT_DIR}/scripts" "${STAGE_DIR}/"
|
||||||
|
cp -R "${ROOT_DIR}/data" "${STAGE_DIR}/"
|
||||||
|
|
||||||
|
(
|
||||||
|
cd "${STAGE_DIR}"
|
||||||
|
zip -rq "${WORKFLOW_FILE}" .
|
||||||
|
)
|
||||||
|
|
||||||
|
echo "Created ${WORKFLOW_FILE}"
|
||||||
106
data/examples.tsv
Normal file
106
data/examples.tsv
Normal file
@@ -0,0 +1,106 @@
|
|||||||
|
new-session Start a new session tmux new
|
||||||
|
new-session Start a named session tmux new -s mysession
|
||||||
|
new-session Start a session with a named window tmux new -s mysession -n mywindow
|
||||||
|
new-session Start or attach to existing session tmux new -A -s mysession
|
||||||
|
attach-session Attach to last session tmux attach
|
||||||
|
attach-session Attach to a session by name tmux a -t mysession
|
||||||
|
detach-client Detach from current session tmux detach
|
||||||
|
list-sessions List all sessions tmux ls
|
||||||
|
kill-session Kill a session by name tmux kill-session -t mysession
|
||||||
|
kill-session Kill all sessions but current tmux kill-session -a
|
||||||
|
kill-session Kill all sessions except one tmux kill-session -a -t mysession
|
||||||
|
kill-server Kill tmux server and all sessions tmux kill-server
|
||||||
|
rename-session Rename current session tmux rename-session newname
|
||||||
|
switch-client Switch to another session tmux switch-client -t mysession
|
||||||
|
has-session Check if a session exists tmux has-session -t mysession
|
||||||
|
new-window Create a new window tmux new-window
|
||||||
|
new-window Create a named window tmux new-window -n editor
|
||||||
|
rename-window Rename current window tmux rename-window newname
|
||||||
|
kill-window Kill current window tmux kill-window
|
||||||
|
select-window Select window by number tmux select-window -t :2
|
||||||
|
next-window Go to next window tmux next-window
|
||||||
|
previous-window Go to previous window tmux previous-window
|
||||||
|
last-window Toggle last active window tmux last-window
|
||||||
|
swap-window Swap two windows tmux swap-window -s 2 -t 1
|
||||||
|
swap-window Move current window left tmux swap-window -t -1
|
||||||
|
move-window Move window between sessions tmux move-window -s foo:0 -t bar:9
|
||||||
|
move-window Renumber windows to remove gaps tmux move-window -r
|
||||||
|
list-windows List windows tmux list-windows
|
||||||
|
link-window Link window from another session tmux link-window -s src:1 -t dst
|
||||||
|
unlink-window Unlink a window tmux unlink-window -t :1
|
||||||
|
split-window Split pane vertically (left/right) tmux split-window -h
|
||||||
|
split-window Split pane horizontally (top/bottom) tmux split-window -v
|
||||||
|
split-window Split pane with specific size tmux split-window -h -l 30%
|
||||||
|
select-pane Select pane by number tmux select-pane -t 1
|
||||||
|
select-pane Select pane to the left tmux select-pane -L
|
||||||
|
select-pane Select pane above tmux select-pane -U
|
||||||
|
resize-pane Resize pane left tmux resize-pane -L 10
|
||||||
|
resize-pane Resize pane right tmux resize-pane -R 10
|
||||||
|
resize-pane Resize pane up tmux resize-pane -U 5
|
||||||
|
resize-pane Resize pane down tmux resize-pane -D 5
|
||||||
|
resize-pane Zoom/unzoom pane tmux resize-pane -Z
|
||||||
|
kill-pane Kill current pane tmux kill-pane
|
||||||
|
swap-pane Swap two panes tmux swap-pane -s 0 -t 1
|
||||||
|
join-pane Move pane from another window tmux join-pane -s :1
|
||||||
|
break-pane Move pane to its own window tmux break-pane
|
||||||
|
display-panes Show pane numbers tmux display-panes
|
||||||
|
move-pane Move pane to another window tmux move-pane -t :2
|
||||||
|
last-pane Toggle last active pane tmux last-pane
|
||||||
|
rotate-window Rotate panes tmux rotate-window
|
||||||
|
pipe-pane Log pane output to file tmux pipe-pane -o 'cat >> ~/tmux.log'
|
||||||
|
copy-mode Enter copy mode tmux copy-mode
|
||||||
|
capture-pane Capture pane content to buffer tmux capture-pane -pS -200
|
||||||
|
list-buffers List all paste buffers tmux list-buffers
|
||||||
|
show-buffer Show buffer contents tmux show-buffer
|
||||||
|
choose-buffer Choose and paste a buffer tmux choose-buffer
|
||||||
|
save-buffer Save buffer to file tmux save-buffer ~/tmux-buffer.txt
|
||||||
|
paste-buffer Paste buffer tmux paste-buffer
|
||||||
|
delete-buffer Delete a buffer tmux delete-buffer -b 0
|
||||||
|
set-buffer Set buffer content tmux set-buffer "text"
|
||||||
|
load-buffer Load file into buffer tmux load-buffer ~/file.txt
|
||||||
|
send-keys Send keys to a pane tmux send-keys -t :1 "ls" Enter
|
||||||
|
send-keys Send keys to a session tmux send-keys -t mysession "cmd" Enter
|
||||||
|
set-option Enable mouse mode tmux set -g mouse on
|
||||||
|
set-option Set vi mode keys tmux set -g mode-keys vi
|
||||||
|
set-option Set base index to 1 tmux set -g base-index 1
|
||||||
|
set-option Set escape time tmux set -sg escape-time 0
|
||||||
|
set-option Set history limit tmux set -g history-limit 10000
|
||||||
|
set-option Set default terminal tmux set -g default-terminal "screen-256color"
|
||||||
|
set-window-option Set pane base index tmux setw -g pane-base-index 1
|
||||||
|
set-window-option Enable automatic rename tmux setw -g automatic-rename on
|
||||||
|
show-options Show all global options tmux show-options -g
|
||||||
|
show-options Show a specific option tmux show-options -g status-style
|
||||||
|
source-file Reload tmux config tmux source-file ~/.tmux.conf
|
||||||
|
bind-key Bind key to reload config tmux bind r source-file ~/.tmux.conf \; display "Reloaded"
|
||||||
|
bind-key Bind key to split vertical tmux bind | split-window -h
|
||||||
|
unbind-key Remove a key binding tmux unbind-key r
|
||||||
|
list-keys List all key bindings tmux list-keys
|
||||||
|
list-keys Show bindings for a key tmux list-keys -T prefix C-a
|
||||||
|
choose-tree Interactive session/window chooser tmux choose-tree
|
||||||
|
choose-tree Interactive session chooser tmux choose-tree -s
|
||||||
|
display-message Show a message tmux display-message "Hello"
|
||||||
|
display-message Show pane title tmux display-message -p "#{pane_title}"
|
||||||
|
command-prompt Open command prompt tmux command-prompt
|
||||||
|
show-environment Show environment variables tmux show-environment -g
|
||||||
|
set-environment Set environment variable tmux set-environment -g EDITOR nvim
|
||||||
|
run-shell Run shell command tmux run-shell "script.sh"
|
||||||
|
if-shell Run command conditionally tmux if-shell "test -f ~/.tmux.conf" "source ~/.tmux.conf"
|
||||||
|
display-popup Show a popup window tmux display-popup -w 80% -h 80%
|
||||||
|
display-menu Show a menu tmux display-menu -T "Title" "Item1" i "run cmd1"
|
||||||
|
clock-mode Show clock tmux clock-mode
|
||||||
|
clear-history Clear pane history tmux clear-history
|
||||||
|
confirm-before Ask before running command tmux confirm-before kill-session
|
||||||
|
refresh-client Refresh client display tmux refresh-client
|
||||||
|
respawn-pane Restart a dead pane tmux respawn-pane -k
|
||||||
|
respawn-window Restart a dead window tmux respawn-window -k
|
||||||
|
lock-server Lock the server tmux lock-server
|
||||||
|
suspend-client Suspend the client tmux suspend-client
|
||||||
|
wait-for Wait for a signal tmux wait-for signal-name
|
||||||
|
list-commands List all tmux commands tmux list-commands
|
||||||
|
show-messages Show log messages tmux show-messages
|
||||||
|
find-window Find window by name tmux find-window -N "editor"
|
||||||
|
select-layout Set pane layout tmux select-layout even-horizontal
|
||||||
|
select-layout Set tiled layout tmux select-layout tiled
|
||||||
|
customize-mode Enter customize mode tmux customize-mode
|
||||||
|
set-hook Set a hook tmux set-hook after-new-window "select-layout tiled"
|
||||||
|
show-hooks Show all hooks tmux show-hooks -g
|
||||||
|
Can't render this file because it contains an unexpected character in line 59 and column 47.
|
138
data/tiers.tsv
Normal file
138
data/tiers.tsv
Normal file
@@ -0,0 +1,138 @@
|
|||||||
|
key-c 1
|
||||||
|
key-d 1
|
||||||
|
key-" 1
|
||||||
|
key-% 1
|
||||||
|
key-x 1
|
||||||
|
key-z 1
|
||||||
|
key-o 1
|
||||||
|
key-0-to-9 1
|
||||||
|
key-n 1
|
||||||
|
key-p 1
|
||||||
|
key-, 1
|
||||||
|
key-$ 1
|
||||||
|
key-w 1
|
||||||
|
key-[ 1
|
||||||
|
key-] 1
|
||||||
|
key-: 1
|
||||||
|
key-? 1
|
||||||
|
new-session 1
|
||||||
|
attach-session 1
|
||||||
|
detach-client 1
|
||||||
|
list-sessions 1
|
||||||
|
kill-session 1
|
||||||
|
kill-server 1
|
||||||
|
split-window 1
|
||||||
|
select-pane 1
|
||||||
|
new-window 1
|
||||||
|
select-window 1
|
||||||
|
rename-window 1
|
||||||
|
kill-window 1
|
||||||
|
kill-pane 1
|
||||||
|
resize-pane 1
|
||||||
|
source-file 1
|
||||||
|
copy-mode 1
|
||||||
|
set-option 1
|
||||||
|
key-C-b 2
|
||||||
|
key-; 2
|
||||||
|
key-l 2
|
||||||
|
key-s 2
|
||||||
|
key-& 2
|
||||||
|
key-! 2
|
||||||
|
key-{ 2
|
||||||
|
key-} 2
|
||||||
|
key-D 2
|
||||||
|
key-L 2
|
||||||
|
key-( 2
|
||||||
|
key-) 2
|
||||||
|
key-f 2
|
||||||
|
key-q 2
|
||||||
|
key-Page-Up 2
|
||||||
|
key-Space 2
|
||||||
|
key-' 2
|
||||||
|
key-. 2
|
||||||
|
key-# 2
|
||||||
|
key-= 2
|
||||||
|
key-- 2
|
||||||
|
rename-session 2
|
||||||
|
switch-client 2
|
||||||
|
next-window 2
|
||||||
|
previous-window 2
|
||||||
|
last-window 2
|
||||||
|
last-pane 2
|
||||||
|
swap-pane 2
|
||||||
|
swap-window 2
|
||||||
|
move-window 2
|
||||||
|
join-pane 2
|
||||||
|
break-pane 2
|
||||||
|
list-windows 2
|
||||||
|
list-panes 2
|
||||||
|
send-keys 2
|
||||||
|
show-options 2
|
||||||
|
bind-key 2
|
||||||
|
unbind-key 2
|
||||||
|
list-keys 2
|
||||||
|
display-message 2
|
||||||
|
has-session 2
|
||||||
|
list-clients 2
|
||||||
|
choose-tree 2
|
||||||
|
choose-client 2
|
||||||
|
command-prompt 2
|
||||||
|
set-window-option 2
|
||||||
|
key-C-o 3
|
||||||
|
key-C-z 3
|
||||||
|
key-i 3
|
||||||
|
key-m 3
|
||||||
|
key-M 3
|
||||||
|
key-r 3
|
||||||
|
key-t 3
|
||||||
|
key-~ 3
|
||||||
|
key-M-n 3
|
||||||
|
key-M-o 3
|
||||||
|
key-M-p 3
|
||||||
|
capture-pane 3
|
||||||
|
rotate-window 3
|
||||||
|
select-layout 3
|
||||||
|
next-layout 3
|
||||||
|
previous-layout 3
|
||||||
|
move-pane 3
|
||||||
|
resize-window 3
|
||||||
|
link-window 3
|
||||||
|
unlink-window 3
|
||||||
|
pipe-pane 3
|
||||||
|
find-window 3
|
||||||
|
display-panes 3
|
||||||
|
paste-buffer 3
|
||||||
|
choose-buffer 3
|
||||||
|
list-buffers 3
|
||||||
|
delete-buffer 3
|
||||||
|
set-buffer 3
|
||||||
|
save-buffer 3
|
||||||
|
load-buffer 3
|
||||||
|
show-buffer 3
|
||||||
|
clear-history 3
|
||||||
|
set-hook 3
|
||||||
|
show-hooks 3
|
||||||
|
set-environment 3
|
||||||
|
show-environment 3
|
||||||
|
respawn-pane 3
|
||||||
|
respawn-window 3
|
||||||
|
confirm-before 3
|
||||||
|
display-popup 3
|
||||||
|
display-menu 3
|
||||||
|
run-shell 3
|
||||||
|
if-shell 3
|
||||||
|
send-prefix 3
|
||||||
|
clock-mode 3
|
||||||
|
refresh-client 3
|
||||||
|
lock-server 3
|
||||||
|
lock-client 3
|
||||||
|
lock-session 3
|
||||||
|
customize-mode 3
|
||||||
|
suspend-client 4
|
||||||
|
start-server 4
|
||||||
|
server-access 4
|
||||||
|
show-messages 4
|
||||||
|
list-commands 4
|
||||||
|
clear-prompt-history 4
|
||||||
|
show-prompt-history 4
|
||||||
|
wait-for 4
|
||||||
|
Can't render this file because it contains an unexpected character in line 3 and column 5.
|
156
data/tmux_commands.tsv
Normal file
156
data/tmux_commands.tsv
Normal file
@@ -0,0 +1,156 @@
|
|||||||
|
attach-session Attach to a session by name tmux a -t mysession
|
||||||
|
attach-session Attach to last session tmux attach
|
||||||
|
copy-mode Enter copy mode tmux copy-mode
|
||||||
|
detach-client Detach from current session tmux detach
|
||||||
|
key-, Rename the current window. {prefix} ,
|
||||||
|
key-: Enter the tmux command prompt. {prefix} :
|
||||||
|
key-? List all key bindings. {prefix} ?
|
||||||
|
key-" Split the current pane into two, top and bottom. {prefix} "
|
||||||
|
key-[ Enter copy mode to copy text or view the history. {prefix} [
|
||||||
|
key-] Paste the most recently copied buffer of text. {prefix} ]
|
||||||
|
key-% Split the current pane into two, left and right. {prefix} %
|
||||||
|
key-$ Rename the current session. {prefix} $
|
||||||
|
key-0-to-9 Select windows 0 to 9. {prefix} 0 to 9
|
||||||
|
key-c Create a new window. {prefix} c
|
||||||
|
key-d Detach the current client. {prefix} d
|
||||||
|
key-n Change to the next window. {prefix} n
|
||||||
|
key-o Select the next pane in the current window. {prefix} o
|
||||||
|
key-p Change to the previous window. {prefix} p
|
||||||
|
key-w Choose the current window interactively. {prefix} w
|
||||||
|
key-x Kill the current pane. {prefix} x
|
||||||
|
key-z Toggle zoom state of the current pane. {prefix} z
|
||||||
|
kill-pane Kill current pane tmux kill-pane
|
||||||
|
kill-server Kill tmux server and all sessions tmux kill-server
|
||||||
|
kill-session Kill a session by name tmux kill-session -t mysession
|
||||||
|
kill-session Kill all sessions but current tmux kill-session -a
|
||||||
|
kill-session Kill all sessions except one tmux kill-session -a -t mysession
|
||||||
|
kill-window Kill current window tmux kill-window
|
||||||
|
list-sessions List all sessions tmux ls
|
||||||
|
new-session Start a named session tmux new -s mysession
|
||||||
|
new-session Start a new session tmux new
|
||||||
|
new-session Start a session with a named window tmux new -s mysession -n mywindow
|
||||||
|
new-session Start or attach to existing session tmux new -A -s mysession
|
||||||
|
new-window Create a named window tmux new-window -n editor
|
||||||
|
new-window Create a new window tmux new-window
|
||||||
|
rename-window Rename current window tmux rename-window newname
|
||||||
|
resize-pane Resize pane down tmux resize-pane -D 5
|
||||||
|
resize-pane Resize pane left tmux resize-pane -L 10
|
||||||
|
resize-pane Resize pane right tmux resize-pane -R 10
|
||||||
|
resize-pane Resize pane up tmux resize-pane -U 5
|
||||||
|
resize-pane Zoom/unzoom pane tmux resize-pane -Z
|
||||||
|
select-pane Select pane above tmux select-pane -U
|
||||||
|
select-pane Select pane by number tmux select-pane -t 1
|
||||||
|
select-pane Select pane to the left tmux select-pane -L
|
||||||
|
select-window Select window by number tmux select-window -t :2
|
||||||
|
set-option Enable mouse mode tmux set -g mouse on
|
||||||
|
set-option Set base index to 1 tmux set -g base-index 1
|
||||||
|
set-option Set default terminal tmux set -g default-terminal "screen-256color"
|
||||||
|
set-option Set escape time tmux set -sg escape-time 0
|
||||||
|
set-option Set history limit tmux set -g history-limit 10000
|
||||||
|
set-option Set vi mode keys tmux set -g mode-keys vi
|
||||||
|
source-file Reload tmux config tmux source-file ~/.tmux.conf
|
||||||
|
split-window Split pane horizontally (top/bottom) tmux split-window -v
|
||||||
|
split-window Split pane vertically (left/right) tmux split-window -h
|
||||||
|
split-window Split pane with specific size tmux split-window -h -l 30%
|
||||||
|
bind-key Bind key to reload config tmux bind r source-file ~/.tmux.conf \; display "Reloaded"
|
||||||
|
bind-key Bind key to split vertical tmux bind | split-window -h
|
||||||
|
break-pane Move pane to its own window tmux break-pane
|
||||||
|
choose-tree Interactive session chooser tmux choose-tree -s
|
||||||
|
choose-tree Interactive session/window chooser tmux choose-tree
|
||||||
|
command-prompt Open command prompt tmux command-prompt
|
||||||
|
display-message Show a message tmux display-message "Hello"
|
||||||
|
display-message Show pane title tmux display-message -p "#{pane_title}"
|
||||||
|
has-session Check if a session exists tmux has-session -t mysession
|
||||||
|
join-pane Move pane from another window tmux join-pane -s :1
|
||||||
|
key-- Delete the most recently copied buffer of text. {prefix} -
|
||||||
|
key-; Move to the previously active pane. {prefix} ;
|
||||||
|
key-! Break the current pane out of the window. {prefix} !
|
||||||
|
key-. Prompt for an index to move the current window. {prefix} .
|
||||||
|
key-' Prompt for a window index to select. {prefix} '
|
||||||
|
key-( Switch the attached client to the previous session. {prefix} (
|
||||||
|
key-) Switch the attached client to the next session. {prefix} )
|
||||||
|
key-{ Swap the current pane with the previous pane. {prefix} {
|
||||||
|
key-} Swap the current pane with the next pane. {prefix} }
|
||||||
|
key-& Kill the current window. {prefix} &
|
||||||
|
key-# List all paste buffers. {prefix} #
|
||||||
|
key-= Choose which buffer to paste interactively from a list. {prefix} =
|
||||||
|
key-C-b Send the prefix key (C-b) through to the application. {prefix} Ctrl+b
|
||||||
|
key-D Choose a client to detach. {prefix} D
|
||||||
|
key-f Prompt to search for text in open windows. {prefix} f
|
||||||
|
key-l Move to the previously selected window. {prefix} l
|
||||||
|
key-L Switch the attached client back to the last session. {prefix} L
|
||||||
|
key-Page-Up Enter copy mode and scroll one page up. {prefix} Page Up
|
||||||
|
key-q Briefly display pane indexes. {prefix} q
|
||||||
|
key-s Select a new session for the attached client {prefix} s
|
||||||
|
key-Space Arrange the current window in the next preset layout. {prefix} Space
|
||||||
|
last-pane Toggle last active pane tmux last-pane
|
||||||
|
last-window Toggle last active window tmux last-window
|
||||||
|
list-keys List all key bindings tmux list-keys
|
||||||
|
list-keys Show bindings for a key tmux list-keys -T prefix C-a
|
||||||
|
list-windows List windows tmux list-windows
|
||||||
|
move-window Move window between sessions tmux move-window -s foo:0 -t bar:9
|
||||||
|
move-window Renumber windows to remove gaps tmux move-window -r
|
||||||
|
next-window Go to next window tmux next-window
|
||||||
|
previous-window Go to previous window tmux previous-window
|
||||||
|
rename-session Rename current session tmux rename-session newname
|
||||||
|
send-keys Send keys to a pane tmux send-keys -t :1 "ls" Enter
|
||||||
|
send-keys Send keys to a session tmux send-keys -t mysession "cmd" Enter
|
||||||
|
set-window-option Enable automatic rename tmux setw -g automatic-rename on
|
||||||
|
set-window-option Set pane base index tmux setw -g pane-base-index 1
|
||||||
|
show-options Show a specific option tmux show-options -g status-style
|
||||||
|
show-options Show all global options tmux show-options -g
|
||||||
|
swap-pane Swap two panes tmux swap-pane -s 0 -t 1
|
||||||
|
swap-window Move current window left tmux swap-window -t -1
|
||||||
|
swap-window Swap two windows tmux swap-window -s 2 -t 1
|
||||||
|
switch-client Switch to another session tmux switch-client -t mysession
|
||||||
|
unbind-key Remove a key binding tmux unbind-key r
|
||||||
|
capture-pane Capture pane content to buffer tmux capture-pane -pS -200
|
||||||
|
choose-buffer Choose and paste a buffer tmux choose-buffer
|
||||||
|
clear-history Clear pane history tmux clear-history
|
||||||
|
clock-mode Show clock tmux clock-mode
|
||||||
|
confirm-before Ask before running command tmux confirm-before kill-session
|
||||||
|
customize-mode Enter customize mode tmux customize-mode
|
||||||
|
delete-buffer Delete a buffer tmux delete-buffer -b 0
|
||||||
|
display-menu Show a menu tmux display-menu -T "Title" "Item1" i "run cmd1"
|
||||||
|
display-panes Show pane numbers tmux display-panes
|
||||||
|
display-popup Show a popup window tmux display-popup -w 80% -h 80%
|
||||||
|
find-window Find window by name tmux find-window -N "editor"
|
||||||
|
if-shell Run command conditionally tmux if-shell "test -f ~/.tmux.conf" "source ~/.tmux.conf"
|
||||||
|
key-~ Show previous messages from tmux, if any. {prefix} ~
|
||||||
|
key-C-o Rotate the panes in the current window forwards. {prefix} Ctrl+o
|
||||||
|
key-C-z Suspend the tmux client. {prefix} Ctrl+z
|
||||||
|
key-i Display some information about the current window. {prefix} i
|
||||||
|
key-M Clear the marked pane. {prefix} M
|
||||||
|
key-m Mark the current pane (see select-pane -m). {prefix} m
|
||||||
|
key-M-1-to-M-7 Arrange panes in one of the seven preset layouts: even- {prefix} Alt+1 to Alt+7
|
||||||
|
key-M-n Move to the next window with a bell or activity marker. {prefix} Alt+n
|
||||||
|
key-M-o Rotate the panes in the current window backwards. {prefix} Alt+o
|
||||||
|
key-M-p Move to the previous window with a bell or activity {prefix} Alt+p
|
||||||
|
key-r Force redraw of the attached client. {prefix} r
|
||||||
|
key-t Show the time. {prefix} t
|
||||||
|
link-window Link window from another session tmux link-window -s src:1 -t dst
|
||||||
|
list-buffers List all paste buffers tmux list-buffers
|
||||||
|
load-buffer Load file into buffer tmux load-buffer ~/file.txt
|
||||||
|
lock-server Lock the server tmux lock-server
|
||||||
|
move-pane Move pane to another window tmux move-pane -t :2
|
||||||
|
paste-buffer Paste buffer tmux paste-buffer
|
||||||
|
pipe-pane Log pane output to file tmux pipe-pane -o 'cat >> ~/tmux.log'
|
||||||
|
refresh-client Refresh client display tmux refresh-client
|
||||||
|
respawn-pane Restart a dead pane tmux respawn-pane -k
|
||||||
|
respawn-window Restart a dead window tmux respawn-window -k
|
||||||
|
rotate-window Rotate panes tmux rotate-window
|
||||||
|
run-shell Run shell command tmux run-shell "script.sh"
|
||||||
|
save-buffer Save buffer to file tmux save-buffer ~/tmux-buffer.txt
|
||||||
|
select-layout Set pane layout tmux select-layout even-horizontal
|
||||||
|
select-layout Set tiled layout tmux select-layout tiled
|
||||||
|
set-buffer Set buffer content tmux set-buffer "text"
|
||||||
|
set-environment Set environment variable tmux set-environment -g EDITOR nvim
|
||||||
|
set-hook Set a hook tmux set-hook after-new-window "select-layout tiled"
|
||||||
|
show-buffer Show buffer contents tmux show-buffer
|
||||||
|
show-environment Show environment variables tmux show-environment -g
|
||||||
|
show-hooks Show all hooks tmux show-hooks -g
|
||||||
|
unlink-window Unlink a window tmux unlink-window -t :1
|
||||||
|
list-commands List all tmux commands tmux list-commands
|
||||||
|
show-messages Show log messages tmux show-messages
|
||||||
|
suspend-client Suspend the client tmux suspend-client
|
||||||
|
wait-for Wait for a signal tmux wait-for signal-name
|
||||||
|
Can't render this file because it contains an unexpected character in line 8 and column 5.
|
135
info.plist
Normal file
135
info.plist
Normal file
@@ -0,0 +1,135 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
|
<plist version="1.0">
|
||||||
|
<dict>
|
||||||
|
<key>bundleid</key>
|
||||||
|
<string>de.felixfoertsch.alfred-tmux-cheatsheet</string>
|
||||||
|
<key>connections</key>
|
||||||
|
<dict>
|
||||||
|
<key>710D59E1-6AE3-40F9-BAA8-C0C0359DF7D3</key>
|
||||||
|
<array>
|
||||||
|
<dict>
|
||||||
|
<key>destinationuid</key>
|
||||||
|
<string>A1B2C3D4-COPY-CLIP-BOARD-E5F6G7H8I9J0</string>
|
||||||
|
<key>modifiers</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>modifiersubtext</key>
|
||||||
|
<string></string>
|
||||||
|
<key>vitowards</key>
|
||||||
|
<string>right</string>
|
||||||
|
</dict>
|
||||||
|
</array>
|
||||||
|
</dict>
|
||||||
|
<key>createdby</key>
|
||||||
|
<string>Felix Foertsch</string>
|
||||||
|
<key>description</key>
|
||||||
|
<string>Quickly look up tmux commands, key bindings, and practical examples.</string>
|
||||||
|
<key>disabled</key>
|
||||||
|
<false/>
|
||||||
|
<key>name</key>
|
||||||
|
<string>tmux Cheat Sheet</string>
|
||||||
|
<key>objects</key>
|
||||||
|
<array>
|
||||||
|
<dict>
|
||||||
|
<key>config</key>
|
||||||
|
<dict>
|
||||||
|
<key>alfredfiltersresults</key>
|
||||||
|
<false/>
|
||||||
|
<key>argumenttrimmode</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>argumenttype</key>
|
||||||
|
<integer>1</integer>
|
||||||
|
<key>escaping</key>
|
||||||
|
<integer>102</integer>
|
||||||
|
<key>keyword</key>
|
||||||
|
<string>tmux</string>
|
||||||
|
<key>queuedelaycustom</key>
|
||||||
|
<integer>1</integer>
|
||||||
|
<key>queuedelayimmediatelyinitially</key>
|
||||||
|
<true/>
|
||||||
|
<key>queuemode</key>
|
||||||
|
<integer>2</integer>
|
||||||
|
<key>runningsubtext</key>
|
||||||
|
<string>Searching tmux commands...</string>
|
||||||
|
<key>script</key>
|
||||||
|
<string>bash scripts/tmux_search.sh "{query}"</string>
|
||||||
|
<key>subtext</key>
|
||||||
|
<integer>1</integer>
|
||||||
|
<key>title</key>
|
||||||
|
<string>Search tmux commands</string>
|
||||||
|
<key>type</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>withspace</key>
|
||||||
|
<true/>
|
||||||
|
</dict>
|
||||||
|
<key>type</key>
|
||||||
|
<string>alfred.workflow.input.scriptfilter</string>
|
||||||
|
<key>uid</key>
|
||||||
|
<string>710D59E1-6AE3-40F9-BAA8-C0C0359DF7D3</string>
|
||||||
|
<key>version</key>
|
||||||
|
<integer>3</integer>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>config</key>
|
||||||
|
<dict>
|
||||||
|
<key>clipboardtext</key>
|
||||||
|
<string>{query}</string>
|
||||||
|
<key>transient</key>
|
||||||
|
<false/>
|
||||||
|
</dict>
|
||||||
|
<key>type</key>
|
||||||
|
<string>alfred.workflow.output.clipboard</string>
|
||||||
|
<key>uid</key>
|
||||||
|
<string>A1B2C3D4-COPY-CLIP-BOARD-E5F6G7H8I9J0</string>
|
||||||
|
<key>version</key>
|
||||||
|
<integer>3</integer>
|
||||||
|
</dict>
|
||||||
|
</array>
|
||||||
|
<key>readme</key>
|
||||||
|
<string>tmux Cheat Sheet — quickly look up tmux commands and key bindings from Alfred.
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
1. Type "tmux" followed by your query (e.g. "tmux split", "tmux new session name")
|
||||||
|
2. Results show practical commands and default key bindings
|
||||||
|
3. Press Enter to copy the result to clipboard
|
||||||
|
4. Press Cmd+L for large type view
|
||||||
|
|
||||||
|
Configuration:
|
||||||
|
Go to Configure Workflow to change the prefix key (default: Ctrl+b).
|
||||||
|
|
||||||
|
Data:
|
||||||
|
Key bindings are parsed from your local tmux manual.
|
||||||
|
Practical examples are curated in data/examples.tsv.
|
||||||
|
Run "bash scripts/parse_manual.sh" to regenerate after a tmux update.</string>
|
||||||
|
<key>uid</key>
|
||||||
|
<string>B92B9447-7F37-440D-B747-F0F504688948</string>
|
||||||
|
<key>userconfigurationconfig</key>
|
||||||
|
<array>
|
||||||
|
<dict>
|
||||||
|
<key>config</key>
|
||||||
|
<dict>
|
||||||
|
<key>default</key>
|
||||||
|
<string>Ctrl+b</string>
|
||||||
|
<key>placeholder</key>
|
||||||
|
<string>Ctrl+b</string>
|
||||||
|
<key>trim</key>
|
||||||
|
<true/>
|
||||||
|
</dict>
|
||||||
|
<key>description</key>
|
||||||
|
<string>The tmux prefix key combination (e.g. Ctrl+b or Ctrl+a)</string>
|
||||||
|
<key>label</key>
|
||||||
|
<string>Prefix Key</string>
|
||||||
|
<key>type</key>
|
||||||
|
<string>textfield</string>
|
||||||
|
<key>variable</key>
|
||||||
|
<string>prefix</string>
|
||||||
|
</dict>
|
||||||
|
</array>
|
||||||
|
<key>variablesdontexport</key>
|
||||||
|
<array/>
|
||||||
|
<key>version</key>
|
||||||
|
<string>2026.03.10</string>
|
||||||
|
<key>webaddress</key>
|
||||||
|
<string>https://git.felixfoertsch.de/felixfoertsch/alfred-tmux-cheatsheet</string>
|
||||||
|
</dict>
|
||||||
|
</plist>
|
||||||
77
scripts/parse_manual.sh
Normal file
77
scripts/parse_manual.sh
Normal file
@@ -0,0 +1,77 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
# Build the tmux cheat sheet TSV from curated examples + man page key bindings.
|
||||||
|
# Output format: name\tdescription\tcommand\tshortcut
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||||
|
OUT="${SCRIPT_DIR}/../data/tmux_commands.tsv"
|
||||||
|
EXAMPLES="${SCRIPT_DIR}/../data/examples.tsv"
|
||||||
|
TIERS="${SCRIPT_DIR}/../data/tiers.tsv"
|
||||||
|
|
||||||
|
man tmux | col -b > /tmp/tmux_man_raw.txt
|
||||||
|
|
||||||
|
# Extract key bindings from man page, then append curated examples, then sort by tier
|
||||||
|
{
|
||||||
|
# 1. Key bindings from the man page
|
||||||
|
awk '
|
||||||
|
/^DEFAULT KEY BINDINGS/ { in_keys=1; next }
|
||||||
|
in_keys && /^[A-Z][A-Z ]/ && !/^DEFAULT/ { flush(); in_keys=0 }
|
||||||
|
|
||||||
|
function flush() {
|
||||||
|
if (cur_key != "" && cur_desc != "") {
|
||||||
|
shortcut = "{prefix} " cur_key
|
||||||
|
gsub(/C-/, "Ctrl+", shortcut)
|
||||||
|
gsub(/M-/, "Alt+", shortcut)
|
||||||
|
first = cur_desc
|
||||||
|
sub(/\. .*/, ".", first)
|
||||||
|
name = "key-" cur_key
|
||||||
|
gsub(/[[:space:]]/, "-", name)
|
||||||
|
printf "%s\t%s\t\t%s\n", name, first, shortcut
|
||||||
|
}
|
||||||
|
cur_key = ""
|
||||||
|
cur_desc = ""
|
||||||
|
}
|
||||||
|
|
||||||
|
in_keys && /^\t/ && /[^ \t]/ {
|
||||||
|
flush()
|
||||||
|
line = $0
|
||||||
|
gsub(/^[[:space:]]+/, "", line)
|
||||||
|
n = match(line, /\t| +/)
|
||||||
|
if (n > 0) {
|
||||||
|
cur_key = substr(line, 1, n-1)
|
||||||
|
cur_desc = substr(line, n)
|
||||||
|
gsub(/^[[:space:]]+/, "", cur_desc)
|
||||||
|
gsub(/[[:space:]]+$/, "", cur_desc)
|
||||||
|
gsub(/[[:space:]]+$/, "", cur_key)
|
||||||
|
}
|
||||||
|
next
|
||||||
|
}
|
||||||
|
in_keys && /^\t\t/ && cur_key != "" {
|
||||||
|
line = $0
|
||||||
|
gsub(/^[[:space:]]+/, "", line)
|
||||||
|
gsub(/[[:space:]]+$/, "", line)
|
||||||
|
cur_desc = cur_desc " " line
|
||||||
|
next
|
||||||
|
}
|
||||||
|
|
||||||
|
END { flush() }
|
||||||
|
' /tmp/tmux_man_raw.txt
|
||||||
|
|
||||||
|
# 2. Curated examples (name\tdescription\tcommand, no shortcut)
|
||||||
|
awk -F'\t' '{ printf "%s\t%s\t%s\t\n", $1, $2, $3 }' "${EXAMPLES}"
|
||||||
|
|
||||||
|
} | awk -F'\t' '
|
||||||
|
NR == FNR {
|
||||||
|
tier[$1] = $2
|
||||||
|
next
|
||||||
|
}
|
||||||
|
{
|
||||||
|
split($1, parts, /[[:space:]]/)
|
||||||
|
cmd = parts[1]
|
||||||
|
t = (cmd in tier) ? tier[cmd] : 3
|
||||||
|
print t "\t" $0
|
||||||
|
}
|
||||||
|
' "${TIERS}" - | sort -t$'\t' -k1,1n | cut -f2- > "${OUT}"
|
||||||
|
|
||||||
|
count="$(wc -l < "${OUT}" | tr -d ' ')"
|
||||||
|
echo "Wrote ${count} entries to ${OUT}"
|
||||||
76
scripts/tmux_search.sh
Executable file
76
scripts/tmux_search.sh
Executable file
@@ -0,0 +1,76 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||||
|
DATA_FILE="${SCRIPT_DIR}/../data/tmux_commands.tsv"
|
||||||
|
QUERY="${1:-}"
|
||||||
|
PREFIX="${prefix:-Ctrl+b}"
|
||||||
|
|
||||||
|
awk -F'\t' -v query="${QUERY}" -v max=25 -v pfx="${PREFIX}" '
|
||||||
|
BEGIN {
|
||||||
|
n = split(tolower(query), words, /[[:space:]]+/)
|
||||||
|
count = 0
|
||||||
|
printf "{\"items\":["
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
name = $1; desc = $2; cmd = $3; shortcut = $4
|
||||||
|
if (name == "") next
|
||||||
|
gsub(/{prefix}/, pfx, shortcut)
|
||||||
|
|
||||||
|
blob = tolower(name " " desc " " cmd " " shortcut)
|
||||||
|
for (i = 1; i <= n; i++) {
|
||||||
|
if (index(blob, words[i]) == 0) next
|
||||||
|
}
|
||||||
|
|
||||||
|
if (count >= max) exit
|
||||||
|
|
||||||
|
# Key bindings: title = shortcut + desc, subtitle = empty
|
||||||
|
# Commands: title = desc, subtitle = command
|
||||||
|
if (shortcut != "") {
|
||||||
|
title = shortcut " — " desc
|
||||||
|
subtitle = cmd
|
||||||
|
copy = shortcut
|
||||||
|
} else {
|
||||||
|
title = desc
|
||||||
|
subtitle = cmd
|
||||||
|
copy = cmd
|
||||||
|
}
|
||||||
|
|
||||||
|
# arg = both lines for clipboard
|
||||||
|
if (subtitle != "") {
|
||||||
|
arg = title "\n" subtitle
|
||||||
|
} else {
|
||||||
|
arg = title
|
||||||
|
}
|
||||||
|
|
||||||
|
if (count > 0) printf ","
|
||||||
|
count++
|
||||||
|
|
||||||
|
printf "{\"uid\":\"%s\",", escape(name "-" count)
|
||||||
|
printf "\"title\":\"%s\",", escape(title)
|
||||||
|
printf "\"subtitle\":\"%s\",", escape(subtitle)
|
||||||
|
printf "\"arg\":\"%s\",", escape(arg)
|
||||||
|
printf "\"match\":\"%s\",", escape(name " " desc " " cmd " " shortcut)
|
||||||
|
printf "\"text\":{\"copy\":\"%s\",\"largetype\":\"%s\"},", escape(copy), escape(arg)
|
||||||
|
printf "\"quicklookurl\":\"https://tmuxcheatsheet.com\"}"
|
||||||
|
}
|
||||||
|
|
||||||
|
END {
|
||||||
|
if (count == 0) {
|
||||||
|
printf "{\"uid\":\"no-results\","
|
||||||
|
printf "\"title\":\"No tmux commands found\","
|
||||||
|
printf "\"subtitle\":\"Try a broader query (e.g. split, session, pane, copy)\","
|
||||||
|
printf "\"valid\":false}"
|
||||||
|
}
|
||||||
|
printf "]}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function escape(s) {
|
||||||
|
gsub(/\\/, "\\\\", s)
|
||||||
|
gsub(/"/, "\\\"", s)
|
||||||
|
gsub(/\t/, " ", s)
|
||||||
|
gsub(/\n/, "\\n", s)
|
||||||
|
return s
|
||||||
|
}
|
||||||
|
' "${DATA_FILE}"
|
||||||
45
tests/test_tmux_search.sh
Executable file
45
tests/test_tmux_search.sh
Executable file
@@ -0,0 +1,45 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
||||||
|
SCRIPT="${ROOT_DIR}/scripts/tmux_search.sh"
|
||||||
|
|
||||||
|
assert_contains() {
|
||||||
|
local haystack="${1}"
|
||||||
|
local needle="${2}"
|
||||||
|
if [[ "${haystack}" != *"${needle}"* ]]; then
|
||||||
|
echo "assertion failed: expected output to contain: ${needle}" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Test: session search returns practical results
|
||||||
|
out_session="$(bash "${SCRIPT}" "attach session")"
|
||||||
|
assert_contains "${out_session}" 'Attach to last session'
|
||||||
|
assert_contains "${out_session}" 'tmux attach'
|
||||||
|
|
||||||
|
# Test: new session with name
|
||||||
|
out_new="$(bash "${SCRIPT}" "new session name")"
|
||||||
|
assert_contains "${out_new}" 'Start a named session'
|
||||||
|
assert_contains "${out_new}" 'tmux new -s mysession'
|
||||||
|
|
||||||
|
# Test: key bindings show shortcut, not "key-" prefix
|
||||||
|
out_split="$(bash "${SCRIPT}" "split")"
|
||||||
|
assert_contains "${out_split}" 'Ctrl+b %'
|
||||||
|
if [[ "${out_split}" == *'"title":"key-'* ]]; then
|
||||||
|
echo "assertion failed: title should not contain key- prefix" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Test: practical command in subtitle
|
||||||
|
assert_contains "${out_split}" 'tmux split-window -h'
|
||||||
|
|
||||||
|
# Test: configurable prefix
|
||||||
|
out_custom="$(prefix="Ctrl+a" bash "${SCRIPT}" "split")"
|
||||||
|
assert_contains "${out_custom}" 'Ctrl+a %'
|
||||||
|
|
||||||
|
# Test: no results
|
||||||
|
out_none="$(bash "${SCRIPT}" "definitely-not-a-real-command")"
|
||||||
|
assert_contains "${out_none}" '"uid":"no-results"'
|
||||||
|
|
||||||
|
echo "tests passed"
|
||||||
Reference in New Issue
Block a user