From 00ea2bda1426f1537bb2a343299c2ad035e3f6d9 Mon Sep 17 00:00:00 2001
From: Paul Buetow
Date: Mon, 2 Feb 2026 11:04:31 +0200
Subject: Update content for html
---
about/resources.html | 206 ++++++++++-----------
...tmux-popup-editor-for-cursor-agent-prompts.html | 76 +++++++-
gemfeed/atom.xml | 78 +++++++-
index.html | 2 +-
uptime-stats.html | 2 +-
5 files changed, 242 insertions(+), 122 deletions(-)
diff --git a/about/resources.html b/about/resources.html
index 93027f36..9109db1e 100644
--- a/about/resources.html
+++ b/about/resources.html
@@ -50,54 +50,54 @@
In random order:
-
Java ist auch eine Insel; Christian Ullenboom;
+
Object-Oriented Programming with ANSI-C; Axel-Tobias Schreiner
+
Modern Perl; Chromatic ; Onyx Neon Press
+
Seeking SRE: Conversations About Running Production Systems at Scale; David N. Blank-Edelman; eBook
Perl New Features; Joshua McAdams, brian d foy; Perl School
+
Kubernetes Cookbook; Sameer Naik, Sébastien Goasguen, Jonathan Michaux; O'Reilly
+
Polished Ruby Programming; Jeremy Evans; Packt Publishing
+
Systems Performance Tuning; Gian-Paolo D. Musumeci and others...; O'Reilly
Amazon Web Services in Action; Michael Wittig and Andreas Wittig; Manning Publications
-
Learn You a Haskell for Great Good!; Miran Lipovaca; No Starch Press
-
21st Century C: C Tips from the New School; Ben Klemens; O'Reilly
-
The Go Programming Language; Alan A. A. Donovan; Addison-Wesley Professional
-
Raku Fundamentals; Moritz Lenz; Apress
+
Hands-on Infrastructure Monitoring with Prometheus; Joel Bastos, Pedro Araujo; Packt
The DevOps Handbook; Gene Kim, Jez Humble, Patrick Debois, John Willis; Audible
-
Effective awk programming; Arnold Robbins; O'Reilly
-
Think Raku (aka Think Perl 6); Laurent Rosenfeld, Allen B. Downey; O'Reilly
-
The KCNA (Kubernetes and Cloud Native Associate) Book; Nigel Poulton
-
Raku Recipes; J.J. Merelo; Apress
-
Polished Ruby Programming; Jeremy Evans; Packt Publishing
-
Concurrency in Go; Katherine Cox-Buday; O'Reilly
+
Funktionale Programmierung; Peter Pepper; Springer
Chaos Engineering - System Resiliency in Practice; Casey Rosenthal and Nora Jones; eBook
-
Seeking SRE: Conversations About Running Production Systems at Scale; David N. Blank-Edelman; eBook
-
C++ Programming Language; Bjarne Stroustrup;
Pro Puppet; James Turnbull, Jeffrey McCune; Apress
-
The Kubernetes Book; Nigel Poulton; Unabridged Audiobook
-
Programming Perl aka "The Camel Book"; Tom Christiansen, brian d foy, Larry Wall & Jon Orwant; O'Reilly
-
Object-Oriented Programming with ANSI-C; Axel-Tobias Schreiner
-
DevOps And Site Reliability Engineering Handbook; Stephen Fleming; Audible
-
Terraform Cookbook; Mikael Krief; Packt Publishing
-
Clusterbau mit Linux-HA; Michael Schwartzkopff; O'Reilly
-
Funktionale Programmierung; Peter Pepper; Springer
+
Site Reliability Engineering; How Google runs production systems; O'Reilly
+
Concurrency in Go; Katherine Cox-Buday; O'Reilly
+
The Go Programming Language; Alan A. A. Donovan; Addison-Wesley Professional
+
Leanring eBPF; Liz Rice; O'Reilly
+
Learn You Some Erlang for Great Good; Fred Herbert; No Starch Press
+
21st Century C: C Tips from the New School; Ben Klemens; O'Reilly
+
Ultimate Go Notebook; Bill Kennedy
DNS and BIND; Cricket Liu; O'Reilly
-
Go Brain Teasers - Exercise Your Mind; Miki Tebeka; The Pragmatic Programmers
+
Raku Recipes; J.J. Merelo; Apress
+
100 Go Mistakes and How to Avoid Them; Teiva Harsanyi; Manning Publications
+
Higher Order Perl; Mark Dominus; Morgan Kaufmann
+
Developing Games in Java; David Brackeen and others...; New Riders
+
Effective awk programming; Arnold Robbins; O'Reilly
+
Programming Perl aka "The Camel Book"; Tom Christiansen, brian d foy, Larry Wall & Jon Orwant; O'Reilly
97 things every SRE should know; Emil Stolarsky, Jaime Woo; O'Reilly
-
Kubernetes Cookbook; Sameer Naik, Sébastien Goasguen, Jonathan Michaux; O'Reilly
-
Systems Performance Tuning; Gian-Paolo D. Musumeci and others...; O'Reilly
-
Effective Java; Joshua Bloch; Addison-Wesley Professional
+
The KCNA (Kubernetes and Cloud Native Associate) Book; Nigel Poulton
+
The Kubernetes Book; Nigel Poulton; Unabridged Audiobook
+
Learn You a Haskell for Great Good!; Miran Lipovaca; No Starch Press
The Pragmatic Programmer; David Thomas; Addison-Wesley
-
Ultimate Go Notebook; Bill Kennedy
-
Data Science at the Command Line; Jeroen Janssens; O'Reilly
-
Hands-on Infrastructure Monitoring with Prometheus; Joel Bastos, Pedro Araujo; Packt
-
Developing Games in Java; David Brackeen and others...; New Riders
+
Effective Java; Joshua Bloch; Addison-Wesley Professional
+
Clusterbau mit Linux-HA; Michael Schwartzkopff; O'Reilly
+
The Docker Book; James Turnbull; Kindle
+
C++ Programming Language; Bjarne Stroustrup;
+
The Practise of System and Network Administration; Thomas A. Limoncelli, Christina J. Hogan, Strata R. Chalup; Addison-Wesley Professional Pro Git; Scott Chacon, Ben Straub; Apress
Programming Ruby 3.3 (5th Edition); Noel Rappin, with Dave Thomas; The Pragmatic Bookshelf
Distributed Systems: Principles and Paradigms; Andrew S. Tanenbaum; Pearson
-
Site Reliability Engineering; How Google runs production systems; O'Reilly
-
The Practise of System and Network Administration; Thomas A. Limoncelli, Christina J. Hogan, Strata R. Chalup; Addison-Wesley Professional Pro Git; Scott Chacon, Ben Straub; Apress
-
Systemprogrammierung in Go; Frank Müller; dpunkt
-
The Docker Book; James Turnbull; Kindle
-
Leanring eBPF; Liz Rice; O'Reilly
+
Data Science at the Command Line; Jeroen Janssens; O'Reilly
+
Go Brain Teasers - Exercise Your Mind; Miki Tebeka; The Pragmatic Programmers
Tmux 2: Productive Mouse-free Development; Brain P. Hogan; The Pragmatic Programmers
-
Modern Perl; Chromatic ; Onyx Neon Press
-
Higher Order Perl; Mark Dominus; Morgan Kaufmann
-
Learn You Some Erlang for Great Good; Fred Herbert; No Starch Press
-
100 Go Mistakes and How to Avoid Them; Teiva Harsanyi; Manning Publications
+
Terraform Cookbook; Mikael Krief; Packt Publishing
+
Raku Fundamentals; Moritz Lenz; Apress
+
Java ist auch eine Insel; Christian Ullenboom;
+
Think Raku (aka Think Perl 6); Laurent Rosenfeld, Allen B. Downey; O'Reilly
+
DevOps And Site Reliability Engineering Handbook; Stephen Fleming; Audible
+
Systemprogrammierung in Go; Frank Müller; dpunkt
Technical references
@@ -105,57 +105,57 @@
Understanding the Linux Kernel; Daniel P. Bovet, Marco Cesati; O'Reilly
-
Groovy Kurz & Gut; Joerg Staudemeier; O'Reilly
-
The Linux Programming Interface; Michael Kerrisk; No Starch Press
-
Algorithms; Robert Sedgewick, Kevin Wayne; Addison Wesley
BPF Performance Tools - Linux System and Application Observability, Brendan Gregg; Addison Wesley
-
Go: Design Patterns for Real-World Projects; Mat Ryer; Packt
Relayd and Httpd Mastery; Michael W Lucas
Implementing Service Level Objectives; Alex Hidalgo; O'Reilly
+
Groovy Kurz & Gut; Joerg Staudemeier; O'Reilly
+
The Linux Programming Interface; Michael Kerrisk; No Starch Press
+
Go: Design Patterns for Real-World Projects; Mat Ryer; Packt
+
Algorithms; Robert Sedgewick, Kevin Wayne; Addison Wesley
Self-development and soft-skills books
In random order:
-
Soft Skills; John Sommez; Manning Publications
-
Coders at Work - Reflections on the craft of programming, Peter Seibel and Mitchell Dorian et al., Audiobook
-
The Good Enough Job; Simone Stolzoff; Ebury Edge
-
Ultralearning; Anna Laurent; Self-published via Amazon
-
Buddah and Einstein walk into a Bar; Guy Joseph Ale, Claire Bloom; Blackstone Publishing
-
Who Moved My Cheese?; Dr. Spencer Johnson; Vermilion
-
Atomic Habits; James Clear; Random House Business
-
The Off Switch; Mark Cropley; Virgin Books (RE-READ 1ST TIME)
-
Consciousness: A Very Short Introduction; Susan Blackmore; Oxford Uiversity Press
-
The Bullet Journal Method; Ryder Carroll; Fourth Estate
-
Never Split the Difference; Chris Voss, Tahl Raz; Random House Business
-
Solve for Happy; Mo Gawdat (RE-READ 1ST TIME)
97 Things Every Engineering Manager Should Know; Camille Fournier; Audiobook
-
Eat That Frog!; Brian Tracy; Hodder Paperbacks
Meditation for Mortals, Oliver Burkeman, Audiobook
+
The Obstacle Is The Way; Ryan Holiday; Profile Books Ltd
+
The Software Engineer's Guidebook: Navigating senior, tech lead, and staff engineer positions at tech companies and startups; Gergely Orosz; Audiobook
+
Ultralearning; Scott Young; Thorsons
+
Influence without Authority; A. Cohen, D. Bradford; Wiley
Search Inside Yourself - The Unexpected path to Achieving Success, Happiness (and World Peace); Chade-Meng Tan, Daniel Goleman, Jon Kabat-Zinn; HarperOne
-
The Phoenix Project - A Novel About IT, DevOps, and Helping your Business Win; Gene Kim and Kevin Behr; Trade Select
-
Eat That Frog; Brian Tracy
+
Deep Work; Cal Newport; Piatkus
+
The Off Switch; Mark Cropley; Virgin Books (RE-READ 1ST TIME)
+
Consciousness: A Very Short Introduction; Susan Blackmore; Oxford Uiversity Press
+
Time Management for System Administrators; Thomas A. Limoncelli; O'Reilly
+
Buddah and Einstein walk into a Bar; Guy Joseph Ale, Claire Bloom; Blackstone Publishing
The 7 Habits Of Highly Effective People; Stephen R. Covey; Simon & Schuster UK
-
Stop starting, start finishing; Arne Roock; Lean-Kanban University
-
So Good They Can't Ignore You; Cal Newport; Business Plus
-
The Software Engineer's Guidebook: Navigating senior, tech lead, and staff engineer positions at tech companies and startups; Gergely Orosz; Audiobook
+
Eat That Frog; Brian Tracy
The Daily Stoic; Ryan Holiday, Stephen Hanselman; Profile Books
-
Influence without Authority; A. Cohen, D. Bradford; Wiley
+
So Good They Can't Ignore You; Cal Newport; Business Plus
+
Eat That Frog!; Brian Tracy; Hodder Paperbacks
Slow Productivity; Cal Newport; Penguin Random House
+
The Phoenix Project - A Novel About IT, DevOps, and Helping your Business Win; Gene Kim and Kevin Behr; Trade Select
+
Stop starting, start finishing; Arne Roock; Lean-Kanban University
The Joy of Missing Out; Christina Crook; New Society Publishers
-
The Courage to Be Disliked; Ichiro Kishimi and Fumitake Koga; Audiobook
-
Digital Minimalism; Cal Newport; Portofolio Penguin
-
The Obstacle Is The Way; Ryan Holiday; Profile Books Ltd
-
The Complete Software Developer's Career Guide; John Sonmez; Unabridged Audiobook
+
Never Split the Difference; Chris Voss, Tahl Raz; Random House Business
+
Soft Skills; John Sommez; Manning Publications
+
The Bullet Journal Method; Ryder Carroll; Fourth Estate
+
Getting Things Done; David Allen
+
Coders at Work - Reflections on the craft of programming, Peter Seibel and Mitchell Dorian et al., Audiobook
+
Ultralearning; Anna Laurent; Self-published via Amazon
+
Who Moved My Cheese?; Dr. Spencer Johnson; Vermilion
Staff Engineer: Leadership beyond the management track; Will Larson; Audiobook
-
Time Management for System Administrators; Thomas A. Limoncelli; O'Reilly
-
Deep Work; Cal Newport; Piatkus
+
Digital Minimalism; Cal Newport; Portofolio Penguin
+
The Good Enough Job; Simone Stolzoff; Ebury Edge
101 Essays that change the way you think; Brianna Wiest; Audiobook
-
Getting Things Done; David Allen
+
The Complete Software Developer's Career Guide; John Sonmez; Unabridged Audiobook
The Power of Now; Eckhard Tolle; Yellow Kite
-
Ultralearning; Scott Young; Thorsons
+
The Courage to Be Disliked; Ichiro Kishimi and Fumitake Koga; Audiobook
@@ -164,31 +164,31 @@
Some of these were in-person with exams; others were online learning lectures only. In random order:
-
Structure and Interpretation of Computer Programs; Harold Abelson and more...;
-
Scripting Vim; Damian Conway; O'Reilly Online
+
The Ultimate Kubernetes Bootcamp; School of Devops; O'Reilly Online
+
Ultimate Go Programming; Bill Kennedy; O'Reilly Online
AWS Immersion Day; Amazon; 1-day interactive online training
-
Red Hat Certified System Administrator; Course + certification (Although I had the option, I decided not to take the next course as it is more effective to self learn what I need)
-
Apache Tomcat Best Practises; 3-day on-site training
-
F5 Loadbalancers Training; 2-day on-site training; F5, Inc.
MySQL Deep Dive Workshop; 2-day on-site training
+
The Well-Grounded Rubyist Video Edition; David. A. Black; O'Reilly Online
Protocol buffers; O'Reilly Online
-
Cloud Operations on AWS - Learn how to configure, deploy, maintain, and troubleshoot your AWS environments; 3-day online live training with labs; Amazon
-
The Ultimate Kubernetes Bootcamp; School of Devops; O'Reilly Online
Linux Security and Isolation APIs Training; Michael Kerrisk; 3-day on-site training
-
Developing IaC with Terraform (with Live Lessons); O'Reilly Online
-
Algorithms Video Lectures; Robert Sedgewick; O'Reilly Online
+
Scripting Vim; Damian Conway; O'Reilly Online
+
Cloud Operations on AWS - Learn how to configure, deploy, maintain, and troubleshoot your AWS environments; 3-day online live training with labs; Amazon
+
Red Hat Certified System Administrator; Course + certification (Although I had the option, I decided not to take the next course as it is more effective to self learn what I need)
Functional programming lecture; Remote University of Hagen
-
Ultimate Go Programming; Bill Kennedy; O'Reilly Online
-
The Well-Grounded Rubyist Video Edition; David. A. Black; O'Reilly Online
+
F5 Loadbalancers Training; 2-day on-site training; F5, Inc.
+
Structure and Interpretation of Computer Programs; Harold Abelson and more...;
+
Algorithms Video Lectures; Robert Sedgewick; O'Reilly Online
+
Apache Tomcat Best Practises; 3-day on-site training
+
Developing IaC with Terraform (with Live Lessons); O'Reilly Online
Technical guides
These are not whole books, but guides (smaller or larger) which I found very useful. in random order:
-
Advanced Bash-Scripting Guide
-
How CPUs work at https://cpu.land
Raku Guide at https://raku.guide
+
How CPUs work at https://cpu.land
+
Advanced Bash-Scripting Guide
Podcasts
@@ -197,61 +197,61 @@
In random order:
-
Dev Interrupted
+
Modern Mentor
+
The Pragmatic Engineer Podcast
+
Pratical AI
BSD Now [BSD]
-
The Changelog Podcast(s)
-
Wednesday Wisdom
+
Deep Questions with Cal Newport
Fallthrough [Golang]
-
Modern Mentor
-
The ProdCast (Google SRE Podcast)
Maintainable
-
Cup o' Go [Golang]
-
Pratical AI
Fork Around And Find Out
-
Deep Questions with Cal Newport
-
Backend Banter
-
The Pragmatic Engineer Podcast
+
The Changelog Podcast(s)
+
Cup o' Go [Golang]
Hidden Brain
+
Wednesday Wisdom
+
Backend Banter
+
The ProdCast (Google SRE Podcast)
+
Dev Interrupted
Podcasts I liked
I liked them but am not listening to them anymore. The podcasts have either "finished" (no more episodes) or I stopped listening to them due to time constraints or a shift in my interests.
+
Modern Mentor
Ship It (predecessor of Fork Around And Find Out)
-
Java Pub House
-
Go Time (predecessor of fallthrough)
CRE: Chaosradio Express [german]
+
Go Time (predecessor of fallthrough)
+
Java Pub House
FLOSS weekly
-
Modern Mentor
Newsletters I like
This is a mix of tech and non-tech newsletters I am subscribed to. In random order:
-
Ruby Weekly
-
Register Spill
+
Applied Go Weekly Newsletter
Andreas Brandhorst Newsletter (Sci-Fi author)
+
The Imperfectionist
+
Ruby Weekly
VK Newsletter
The Pragmatic Engineer
-
byteSizeGo
-
Changelog News
Monospace Mentor
-
The Imperfectionist
-
Golang Weekly
-
Applied Go Weekly Newsletter
The Valuable Dev
+
byteSizeGo
+
Golang Weekly
+
Register Spill
+
Changelog News
Magazines I like(d)
This is a mix of tech I like(d). I may not be a current subscriber, but now and then, I buy an issue. In random order:
-
Linux User
+
LWN (online only)
Linux Magazine
+
Linux User
freeX (not published anymore)
-
LWN (online only)
Formal education
diff --git a/gemfeed/2026-02-02-tmux-popup-editor-for-cursor-agent-prompts.html b/gemfeed/2026-02-02-tmux-popup-editor-for-cursor-agent-prompts.html
index 0af513c5..28d77671 100644
--- a/gemfeed/2026-02-02-tmux-popup-editor-for-cursor-agent-prompts.html
+++ b/gemfeed/2026-02-02-tmux-popup-editor-for-cursor-agent-prompts.html
@@ -94,6 +94,8 @@ bind-key e run-shell -b "tmux display-message -p '#{pane_id}'
And here is the full script. It is a bit ugly since it's shell (written with Cursor Agent with GPT-5.2-Codex), and I might (let) rewrite it in Go with propper unit tests, config-file, multi-agent support and release it once I have time. But it works well enough for now.
+Updated 2026-02-02: Script now works on both Linux and macOS; the listing below reflects the latest version.
+
#!/usr/bin/env bashset -u -o pipefail
-declare -i LOG_ENABLED=0
-
+LOG_ENABLED=0
log_file="${TMPDIR:-/tmp}/tmux-edit-send.log"
-
log() {
if [ "$LOG_ENABLED" -eq 1 ]; thenprintf '%s\n' "$*" >> "$log_file"
@@ -114,17 +114,30 @@ log() {
# Read the target pane id from a temp file created by tmux binding.
read_target_from_file() {
local file_path="$1"
+ local pane_id
if [ -n "$file_path" ] && [ -f "$file_path" ]; then
- sed -n '1p' "$file_path" | tr -d '[:space:]'
+ pane_id="$(sed -n '1p' "$file_path" | tr -d '[:space:]')"
+ # Ensure pane ID has % prefix
+ if [ -n "$pane_id" ] && [[ "$pane_id" != %* ]]; then
+ pane_id="%${pane_id}"
+ fi
+ printf '%s' "$pane_id"
fi
}
# Read the target pane id from tmux environment if present.
read_target_from_env() {
- local env_line
+ local env_line pane_id
env_line="$(tmux show-environment -g TMUX_EDIT_TARGET 2>/dev/null || true)"
case "$env_line" in
- TMUX_EDIT_TARGET=*) printf '%s' "${env_line#TMUX_EDIT_TARGET=}" ;;
+ TMUX_EDIT_TARGET=*)
+ pane_id="${env_line#TMUX_EDIT_TARGET=}"
+ # Ensure pane ID has % prefix
+ if [ -n "$pane_id" ] && [[ "$pane_id" != %* ]] && [[ "$pane_id" =~ ^[0-9]+$ ]]; then
+ pane_id="%${pane_id}"
+ fi
+ printf '%s' "$pane_id"
+ ;;
esac
}
@@ -135,16 +148,25 @@ resolve_target_pane() {
current_pane="$(tmux display-message -p "#{pane_id}" 2>/dev/null || true)"
log "current pane=${current_pane:-<empty>}"
+
+ # Ensure candidate has % prefix if it's a pane ID
+ if [ -n "$candidate" ] && [[ "$candidate" =~ ^[0-9]+$ ]]; then
+ candidate="%${candidate}"
+ log "normalized candidate to $candidate"
+ fi
+
if [ -n "$candidate" ] && [[ "$candidate" == *"#{"* ]]; then
log "format target detected, clearing"
candidate=""
fiif [ -z "$candidate" ]; then
candidate="$(tmux display-message -p "#{last_pane}" 2>/dev/null || true)"
+ log "using last pane as fallback: $candidate"
elif [ "$candidate" = "$current_pane" ]; then
last_pane="$(tmux display-message -p "#{last_pane}" 2>/dev/null || true)"if [ -n "$last_pane" ]; then
candidate="$last_pane"
+ log "candidate was current, using last pane: $candidate"
fifiprintf '%s' "$candidate"
@@ -210,9 +232,12 @@ validate_target_pane() {
return 1
fi
target_found=0
+ log "validate: looking for target='$target' in all panes:"
for pane in $(tmux list-panes -a -F "#{pane_id}" 2>/dev/null || true); do
+ log "validate: checking pane='$pane'"
if [ "$pane" = "$target" ]; then
target_found=1
+ log "validate: MATCH FOUND!"
breakfidone
@@ -221,6 +246,7 @@ validate_target_pane() {
echo "Target pane not found: $target" >&2
return 1
fi
+ log "validate: target pane validated successfully"
}
# Send temp file contents to the target pane line by line.
@@ -230,13 +256,18 @@ send_content() {
local prompt_text="$3"
local first_line=1
local line
+ log "send_content: target=$target, prompt_text='$prompt_text'"
while IFS= read -r line || [ -n "$line" ]; do
+ log "send_content: read line='$line'"
if [ "$first_line" -eq 1 ] && [ -n "$prompt_text" ]; thenif [[ "$line" == "$prompt_text"* ]]; then
+ local old_line="$line"
line="${line#"$prompt_text"}"
+ log "send_content: stripped prompt, was='$old_line' now='$line'"
fifi
first_line=0
+ log "send_content: sending line='$line'"
tmux send-keys -t "$target" -l "$line"
tmux send-keys -t "$target" Enter
done < "$tmpfile"
@@ -251,6 +282,10 @@ main() {
local tmpfile
local prompt_text
+ log "=== tmux-edit-send starting ==="
+ log "target_file=$target_file"
+ log "EDITOR=$editor"
+
target="$(read_target_from_file "$target_file" || true)"
if [ -n "$target" ]; then
log "file target=${target:-<empty>}"
@@ -267,22 +302,47 @@ main() {
target="$(resolve_target_pane "$target")"
log "fallback target=${target:-<empty>}"
- tmpfile="$(mktemp "./.tmux-edit-send.XXXXXX.md")"
+ tmpfile="$(mktemp)"
+ log "created tmpfile=$tmpfile"
+ if [ ! -f "$tmpfile" ]; then
+ log "ERROR: mktemp failed to create file"
+ echo "ERROR: mktemp failed" >&2
+ exit 1
+ fi
+ mv "$tmpfile" "${tmpfile}.md" 2>&1 | whileread -r line; do log "mv output: $line"; done
+ tmpfile="${tmpfile}.md"
+ log "renamed to tmpfile=$tmpfile"
+ if [ ! -f "$tmpfile" ]; then
+ log "ERROR: tmpfile does not exist after rename"
+ echo "ERROR: tmpfile rename failed" >&2
+ exit 1
+ fitrap 'rm -f "$tmpfile"' EXIT
+ log "capturing prompt text from target=$target"
prompt_text="$(capture_prompt_text "$target")"
+ log "captured prompt_text='$prompt_text'"
prefill_tmpfile "$tmpfile" "$prompt_text"
+ log "prefilled tmpfile"
+ log "launching editor: $editor $tmpfile"
"$editor" "$tmpfile"
- log "editor exited with status $?"
+ local editor_exit=$?
+ log "editor exited with status $editor_exit"
if [ ! -s "$tmpfile" ]; then
log "empty file, nothing sent"
exit 0
fi
+
+ log "tmpfile contents:"
+ log "$(cat "$tmpfile")"
+ log "validating target pane"
validate_target_pane "$target"
+ log "sending content to target=$target"
send_content "$target" "$tmpfile" "$prompt_text"
+ log "=== tmux-edit-send completed ==="
}
main "$@"
diff --git a/gemfeed/atom.xml b/gemfeed/atom.xml
index 360f46a5..6f849905 100644
--- a/gemfeed/atom.xml
+++ b/gemfeed/atom.xml
@@ -1,6 +1,6 @@
- 2026-02-01T22:27:38+02:00
+ 2026-02-02T11:03:17+02:00foo.zone feedTo be in the .zone!
@@ -101,6 +101,8 @@ bind-key e run-shell -b "tmux display-message -p '#{pane_id}'
And here is the full script. It is a bit ugly since it's shell (written with Cursor Agent with GPT-5.2-Codex), and I might (let) rewrite it in Go with propper unit tests, config-file, multi-agent support and release it once I have time. But it works well enough for now.
+Updated 2026-02-02: Script now works on both Linux and macOS; the listing below reflects the latest version.
+
#!/usr/bin/env bashset -u -o pipefail
-declare -i LOG_ENABLED=0
-
+LOG_ENABLED=0
log_file="${TMPDIR:-/tmp}/tmux-edit-send.log"
-
log() {
if [ "$LOG_ENABLED" -eq 1 ]; thenprintf '%s\n' "$*" >> "$log_file"
@@ -121,17 +121,30 @@ log() {
# Read the target pane id from a temp file created by tmux binding.
read_target_from_file() {
local file_path="$1"
+ local pane_id
if [ -n "$file_path" ] && [ -f "$file_path" ]; then
- sed -n '1p' "$file_path" | tr -d '[:space:]'
+ pane_id="$(sed -n '1p' "$file_path" | tr -d '[:space:]')"
+ # Ensure pane ID has % prefix
+ if [ -n "$pane_id" ] && [[ "$pane_id" != %* ]]; then
+ pane_id="%${pane_id}"
+ fi
+ printf '%s' "$pane_id"
fi
}
# Read the target pane id from tmux environment if present.
read_target_from_env() {
- local env_line
+ local env_line pane_id
env_line="$(tmux show-environment -g TMUX_EDIT_TARGET 2>/dev/null || true)"
case "$env_line" in
- TMUX_EDIT_TARGET=*) printf '%s' "${env_line#TMUX_EDIT_TARGET=}" ;;
+ TMUX_EDIT_TARGET=*)
+ pane_id="${env_line#TMUX_EDIT_TARGET=}"
+ # Ensure pane ID has % prefix
+ if [ -n "$pane_id" ] && [[ "$pane_id" != %* ]] && [[ "$pane_id" =~ ^[0-9]+$ ]]; then
+ pane_id="%${pane_id}"
+ fi
+ printf '%s' "$pane_id"
+ ;;
esac
}
@@ -142,16 +155,25 @@ resolve_target_pane() {
current_pane="$(tmux display-message -p "#{pane_id}" 2>/dev/null || true)"
log "current pane=${current_pane:-<empty>}"
+
+ # Ensure candidate has % prefix if it's a pane ID
+ if [ -n "$candidate" ] && [[ "$candidate" =~ ^[0-9]+$ ]]; then
+ candidate="%${candidate}"
+ log "normalized candidate to $candidate"
+ fi
+
if [ -n "$candidate" ] && [[ "$candidate" == *"#{"* ]]; then
log "format target detected, clearing"
candidate=""
fiif [ -z "$candidate" ]; then
candidate="$(tmux display-message -p "#{last_pane}" 2>/dev/null || true)"
+ log "using last pane as fallback: $candidate"
elif [ "$candidate" = "$current_pane" ]; then
last_pane="$(tmux display-message -p "#{last_pane}" 2>/dev/null || true)"if [ -n "$last_pane" ]; then
candidate="$last_pane"
+ log "candidate was current, using last pane: $candidate"
fifiprintf '%s' "$candidate"
@@ -217,9 +239,12 @@ validate_target_pane() {
return 1
fi
target_found=0
+ log "validate: looking for target='$target' in all panes:"
for pane in $(tmux list-panes -a -F "#{pane_id}" 2>/dev/null || true); do
+ log "validate: checking pane='$pane'"
if [ "$pane" = "$target" ]; then
target_found=1
+ log "validate: MATCH FOUND!"
breakfidone
@@ -228,6 +253,7 @@ validate_target_pane() {
echo "Target pane not found: $target" >&2
return 1
fi
+ log "validate: target pane validated successfully"
}
# Send temp file contents to the target pane line by line.
@@ -237,13 +263,18 @@ send_content() {
local prompt_text="$3"
local first_line=1
local line
+ log "send_content: target=$target, prompt_text='$prompt_text'"
while IFS= read -r line || [ -n "$line" ]; do
+ log "send_content: read line='$line'"
if [ "$first_line" -eq 1 ] && [ -n "$prompt_text" ]; thenif [[ "$line" == "$prompt_text"* ]]; then
+ local old_line="$line"
line="${line#"$prompt_text"}"
+ log "send_content: stripped prompt, was='$old_line' now='$line'"
fifi
first_line=0
+ log "send_content: sending line='$line'"
tmux send-keys -t "$target" -l "$line"
tmux send-keys -t "$target" Enter
done < "$tmpfile"
@@ -258,6 +289,10 @@ main() {
local tmpfile
local prompt_text
+ log "=== tmux-edit-send starting ==="
+ log "target_file=$target_file"
+ log "EDITOR=$editor"
+
target="$(read_target_from_file "$target_file" || true)"
if [ -n "$target" ]; then
log "file target=${target:-<empty>}"
@@ -274,22 +309,47 @@ main() {
target="$(resolve_target_pane "$target")"
log "fallback target=${target:-<empty>}"
- tmpfile="$(mktemp "./.tmux-edit-send.XXXXXX.md")"
+ tmpfile="$(mktemp)"
+ log "created tmpfile=$tmpfile"
+ if [ ! -f "$tmpfile" ]; then
+ log "ERROR: mktemp failed to create file"
+ echo "ERROR: mktemp failed" >&2
+ exit 1
+ fi
+ mv "$tmpfile" "${tmpfile}.md" 2>&1 | whileread -r line; do log "mv output: $line"; done
+ tmpfile="${tmpfile}.md"
+ log "renamed to tmpfile=$tmpfile"
+ if [ ! -f "$tmpfile" ]; then
+ log "ERROR: tmpfile does not exist after rename"
+ echo "ERROR: tmpfile rename failed" >&2
+ exit 1
+ fitrap 'rm -f "$tmpfile"' EXIT
+ log "capturing prompt text from target=$target"
prompt_text="$(capture_prompt_text "$target")"
+ log "captured prompt_text='$prompt_text'"
prefill_tmpfile "$tmpfile" "$prompt_text"
+ log "prefilled tmpfile"
+ log "launching editor: $editor $tmpfile"
"$editor" "$tmpfile"
- log "editor exited with status $?"
+ local editor_exit=$?
+ log "editor exited with status $editor_exit"
if [ ! -s "$tmpfile" ]; then
log "empty file, nothing sent"
exit 0
fi
+
+ log "tmpfile contents:"
+ log "$(cat "$tmpfile")"
+ log "validating target pane"
validate_target_pane "$target"
+ log "sending content to target=$target"
send_content "$target" "$tmpfile" "$prompt_text"
+ log "=== tmux-edit-send completed ==="
}
main "$@"
diff --git a/index.html b/index.html
index e1afd41c..3f3c8529 100644
--- a/index.html
+++ b/index.html
@@ -13,7 +13,7 @@
Hello!
-This site was generated at 2026-02-01T22:27:38+02:00 by Gemtexter
+This site was generated at 2026-02-02T11:03:17+02:00 by Gemtexter
-This site was last updated at 2026-02-01T22:27:38+02:00
+This site was last updated at 2026-02-02T11:03:17+02:00
The following stats were collected via uptimed on all of my personal computers over many years and the output was generated by guprecords, the global uptime records stats analyser of mine.