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