diff options
| author | Craig Jennings <c@cjennings.net> | 2026-05-19 13:09:23 -0500 |
|---|---|---|
| committer | Craig Jennings <c@cjennings.net> | 2026-05-19 13:09:23 -0500 |
| commit | 331d9421f1ca56afdaf0d238082f83d82103a795 (patch) | |
| tree | 4e1f0b568f6fcfa89053da8dc55846afc39ddb0e /tests/tmux-util/fake-tmux | |
| parent | 685272399d7dbc35aea6028d6741963399d84e3f (diff) | |
| download | archsetup-331d9421f1ca56afdaf0d238082f83d82103a795.tar.gz archsetup-331d9421f1ca56afdaf0d238082f83d82103a795.zip | |
feat(tmux-util): add find subcommand
tmux-util find <pattern> walks every pane across every session, queries each pane's foreground command (`#{pane_current_command}`), and prints the location of any pane whose command matches the pattern. Output format: `<session>:<window>.<pane> <command>`, one per line.
Pattern is a basic ERE (passed through `grep -E`), so anchors and alternation work. Substring matching is the common case.
Exit code:
- 0 with output: matches found
- 1 with no output: no matches (lets you script around it)
- 2 with usage on stderr: missing or empty pattern
7 new tests cover Normal cases (single match, multi-match across sessions, format verification) and Boundary cases (no matches, no sessions, missing pattern, empty pattern). fake-tmux now parses pid:cmd entries in the state file so panes can carry a synthetic command name. Total suite: 39 tests, all green.
Diffstat (limited to 'tests/tmux-util/fake-tmux')
| -rwxr-xr-x | tests/tmux-util/fake-tmux | 36 |
1 files changed, 31 insertions, 5 deletions
diff --git a/tests/tmux-util/fake-tmux b/tests/tmux-util/fake-tmux index 163ea24..b5a1e61 100755 --- a/tests/tmux-util/fake-tmux +++ b/tests/tmux-util/fake-tmux @@ -38,6 +38,19 @@ render_format() { echo "$out" } +# Render a tmux format string against one pane's fields. +# Args: format, name, pid, cmd, idx, cwd +render_pane_format() { + local out="$1" name="$2" pid="$3" cmd="$4" idx="$5" cwd="$6" + out="${out//\#\{pane_pid\}/$pid}" + out="${out//\#\{pane_current_command\}/$cmd}" + out="${out//\#\{pane_current_path\}/$cwd}" + out="${out//\#\{session_name\}/$name}" + out="${out//\#\{window_index\}/0}" + out="${out//\#\{pane_index\}/$idx}" + echo "$out" +} + case "$cmd" in list-sessions) fmt="" @@ -54,20 +67,33 @@ case "$cmd" in done ;; list-panes) + all=0 + fmt="" session="" while [ "$#" -gt 0 ]; do case "$1" in -t) shift; session="$1"; shift ;; - -F) shift; [ "$#" -gt 0 ] && shift ;; + -F) shift; fmt="${1:-}"; shift ;; -s) shift ;; + -a) all=1; shift ;; *) shift ;; esac done - read_state | while IFS=' ' read -r name attached pids _rest; do - if [ "$name" = "$session" ]; then - [ "$pids" = "-" ] || echo "$pids" | tr ',' '\n' - exit 0 + [ -n "$fmt" ] || fmt='#{pane_pid}' + read_state | while IFS=' ' read -r name attached pids activity windows cwd; do + [ -n "$name" ] || continue + if [ "$all" -eq 0 ] && [ "$name" != "$session" ]; then + continue fi + [ "$pids" = "-" ] && continue + idx=0 + for entry in $(echo "$pids" | tr ',' ' '); do + pid="${entry%%:*}" + cmd="${entry##*:}" + [ "$cmd" = "$entry" ] && cmd="shell" + render_pane_format "$fmt" "$name" "$pid" "$cmd" "$idx" "${cwd:-/tmp}" + idx=$((idx + 1)) + done done ;; display) |
