summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--about/resources.html186
-rw-r--r--gemfeed/2024-06-23-terminal-multiplexing-with-tmux.html12
-rw-r--r--gemfeed/2025-05-02-terminal-multiplexing-with-tmux-fish-edition.html410
-rw-r--r--gemfeed/atom.xml559
-rw-r--r--gemfeed/index.html3
-rw-r--r--index.html5
-rw-r--r--uptime-stats.html52
7 files changed, 955 insertions, 272 deletions
diff --git a/about/resources.html b/about/resources.html
index 61ec6e34..6516711f 100644
--- a/about/resources.html
+++ b/about/resources.html
@@ -51,52 +51,52 @@
<span>In random order:</span><br />
<br />
<ul>
-<li>Polished Ruby Programming; Jeremy Evans; Packt Publishing</li>
-<li>21st Century C: C Tips from the New School; Ben Klemens; O&#39;Reilly</li>
+<li>Funktionale Programmierung; Peter Pepper; Springer</li>
+<li>Effective Java; Joshua Bloch; Addison-Wesley Professional</li>
<li>Terraform Cookbook; Mikael Krief; Packt Publishing</li>
+<li>Learn You a Haskell for Great Good!; Miran Lipovaca; No Starch Press</li>
+<li>Clusterbau mit Linux-HA; Michael Schwartzkopff; O&#39;Reilly</li>
+<li>Learn You Some Erlang for Great Good; Fred Herbert; No Starch Press</li>
+<li>DNS and BIND; Cricket Liu; O&#39;Reilly</li>
+<li>Effective awk programming; Arnold Robbins; O&#39;Reilly</li>
+<li>The DevOps Handbook; Gene Kim, Jez Humble, Patrick Debois, John Willis; Audible</li>
+<li>Raku Recipes; J.J. Merelo; Apress</li>
+<li>Polished Ruby Programming; Jeremy Evans; Packt Publishing</li>
+<li>Systems Performance Tuning; Gian-Paolo D. Musumeci and others...; O&#39;Reilly</li>
+<li>Ultimate Go Notebook; Bill Kennedy</li>
+<li>C++ Programming Language; Bjarne Stroustrup;</li>
+<li>Distributed Systems: Principles and Paradigms; Andrew S. Tanenbaum; Pearson</li>
+<li>Leanring eBPF; Liz Rice; O&#39;Reilly</li>
<li>Modern Perl; Chromatic ; Onyx Neon Press</li>
<li>Go Brain Teasers - Exercise Your Mind; Miki Tebeka; The Pragmatic Programmers</li>
-<li>The Go Programming Language; Alan A. A. Donovan; Addison-Wesley Professional</li>
-<li>Distributed Systems: Principles and Paradigms; Andrew S. Tanenbaum; Pearson</li>
-<li>Site Reliability Engineering; How Google runs production systems; O&#39;Reilly</li>
-<li>Concurrency in Go; Katherine Cox-Buday; O&#39;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>DevOps And Site Reliability Engineering Handbook; Stephen Fleming; Audible</li>
-<li>Pro Puppet; James Turnbull, Jeffrey McCune; Apress</li>
<li>Programming Perl aka "The Camel Book"; Tom Christiansen, brian d foy, Larry Wall &amp; Jon Orwant; O&#39;Reilly</li>
-<li>Clusterbau mit Linux-HA; Michael Schwartzkopff; O&#39;Reilly</li>
-<li>Higher Order Perl; Mark Dominus; Morgan Kaufmann</li>
-<li>Programming Ruby 3.3 (5th Edition); Noel Rappin, with Dave Thomas; The Pragmatic Bookshelf</li>
+<li>Tmux 2: Productive Mouse-free Development; Brain P. Hogan; The Pragmatic Programmers </li>
<li>Perl New Features; Joshua McAdams, brian d foy; Perl School</li>
-<li>C++ Programming Language; Bjarne Stroustrup;</li>
-<li>Raku Recipes; J.J. Merelo; Apress</li>
-<li>Funktionale Programmierung; Peter Pepper; Springer</li>
-<li>Data Science at the Command Line; Jeroen Janssens; O&#39;Reilly</li>
-<li>The DevOps Handbook; Gene Kim, Jez Humble, Patrick Debois, John Willis; Audible</li>
-<li>The Docker Book; James Turnbull; Kindle</li>
+<li>Systemprogrammierung in Go; Frank Müller; dpunkt</li>
+<li>The Kubernetes Book; Nigel Poulton; Unabridged Audiobook</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>Concurrency in Go; Katherine Cox-Buday; O&#39;Reilly</li>
+<li>Raku Fundamentals; Moritz Lenz; Apress</li>
+<li>21st Century C: C Tips from the New School; Ben Klemens; O&#39;Reilly</li>
+<li>DevOps And Site Reliability Engineering Handbook; Stephen Fleming; Audible</li>
<li>100 Go Mistakes and How to Avoid Them; Teiva Harsanyi; Manning Publications</li>
-<li>Kubernetes Cookbook; Sameer Naik, Sébastien Goasguen, Jonathan Michaux; O&#39;Reilly</li>
-<li>Leanring eBPF; Liz Rice; O&#39;Reilly</li>
-<li>Learn You a Haskell for Great Good!; Miran Lipovaca; No Starch Press</li>
+<li>Object-Oriented Programming with ANSI-C; Axel-Tobias Schreiner</li>
+<li>Think Raku (aka Think Perl 6); Laurent Rosenfeld, Allen B. Downey; O&#39;Reilly</li>
<li>The KCNA (Kubernetes and Cloud Native Associate) Book; Nigel Poulton</li>
+<li>Java ist auch eine Insel; Christian Ullenboom; </li>
+<li>Higher Order Perl; Mark Dominus; Morgan Kaufmann</li>
+<li>Site Reliability Engineering; How Google runs production systems; O&#39;Reilly</li>
<li>97 things every SRE should know; Emil Stolarsky, Jaime Woo; O&#39;Reilly</li>
-<li>Think Raku (aka Think Perl 6); Laurent Rosenfeld, Allen B. Downey; O&#39;Reilly</li>
+<li>Programming Ruby 3.3 (5th Edition); Noel Rappin, with Dave Thomas; The Pragmatic Bookshelf</li>
+<li>Kubernetes Cookbook; Sameer Naik, Sébastien Goasguen, Jonathan Michaux; O&#39;Reilly</li>
<li>Amazon Web Services in Action; Michael Wittig and Andreas Wittig; Manning Publications</li>
-<li>Tmux 2: Productive Mouse-free Development; Brain P. Hogan; The Pragmatic Programmers </li>
-<li>DNS and BIND; Cricket Liu; O&#39;Reilly</li>
-<li>Effective Java; Joshua Bloch; Addison-Wesley Professional</li>
+<li>Data Science at the Command Line; Jeroen Janssens; O&#39;Reilly</li>
+<li>The Go Programming Language; Alan A. A. Donovan; Addison-Wesley Professional</li>
+<li>Pro Puppet; James Turnbull, Jeffrey McCune; Apress</li>
+<li>Developing Games in Java; David Brackeen and others...; New Riders</li>
<li>Hands-on Infrastructure Monitoring with Prometheus; Joel Bastos, Pedro Araujo; Packt </li>
+<li>The Docker Book; James Turnbull; Kindle</li>
<li>The Pragmatic Programmer; David Thomas; Addison-Wesley</li>
-<li>Systemprogrammierung in Go; Frank Müller; dpunkt</li>
-<li>Ultimate Go Notebook; Bill Kennedy</li>
-<li>Systems Performance Tuning; Gian-Paolo D. Musumeci and others...; O&#39;Reilly</li>
-<li>Raku Fundamentals; Moritz Lenz; Apress</li>
-<li>Effective awk programming; Arnold Robbins; O&#39;Reilly</li>
-<li>Developing Games in Java; David Brackeen and others...; New Riders</li>
-<li>Java ist auch eine Insel; Christian Ullenboom; </li>
-<li>Object-Oriented Programming with ANSI-C; Axel-Tobias Schreiner</li>
-<li>Learn You Some Erlang for Great Good; Fred Herbert; No Starch Press</li>
-<li>The Kubernetes Book; Nigel Poulton; Unabridged Audiobook</li>
</ul><br />
<h2 style='display: inline' id='technical-references'>Technical references</h2><br />
<br />
@@ -104,51 +104,51 @@
<br />
<ul>
<li>BPF Performance Tools - Linux System and Application Observability, Brendan Gregg; Addison Wesley</li>
-<li>Relayd and Httpd Mastery; Michael W Lucas</li>
+<li>The Linux Programming Interface; Michael Kerrisk; No Starch Press </li>
<li>Understanding the Linux Kernel; Daniel P. Bovet, Marco Cesati; O&#39;Reilly</li>
-<li>Groovy Kurz &amp; Gut; Joerg Staudemeier; O&#39;Reilly</li>
<li>Implementing Service Level Objectives; Alex Hidalgo; O&#39;Reilly</li>
<li>Algorithms; Robert Sedgewick, Kevin Wayne; Addison Wesley</li>
-<li>The Linux Programming Interface; Michael Kerrisk; No Starch Press </li>
+<li>Relayd and Httpd Mastery; Michael W Lucas</li>
+<li>Groovy Kurz &amp; Gut; Joerg Staudemeier; O&#39;Reilly</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>The Off Switch; Mark Cropley; Virgin Books (RE-READ 1ST TIME)</li>
+<li>Ultralearning; Scott Young; Thorsons</li>
+<li>The 7 Habits Of Highly Effective People; Stephen R. Covey; Simon &amp; Schuster UK</li>
+<li>Eat That Frog; Brian Tracy</li>
+<li>Influence without Authority; A. Cohen, D. Bradford; Wiley</li>
+<li>Eat That Frog!; Brian Tracy; Hodder Paperbacks</li>
+<li>Ultralearning; Anna Laurent; Self-published via Amazon</li>
<li>Digital Minimalism; Cal Newport; Portofolio Penguin</li>
<li>Staff Engineer: Leadership beyond the management track; Will Larson; Audible</li>
-<li>Solve for Happy; Mo Gawdat (RE-READ 1ST TIME)</li>
-<li>Ultralearning; Anna Laurent; Self-published via Amazon</li>
-<li>The Bullet Journal Method; Ryder Carroll; Fourth Estate</li>
-<li>Slow Productivity; Cal Newport; Penguin Random House</li>
-<li>Ultralearning; Scott Young; Thorsons</li>
-<li>The Obstacle Is The Way; Ryan Holiday; Profile Books Ltd</li>
<li>Atomic Habits; James Clear; Random House Business</li>
-<li>The Phoenix Project - A Novel About IT, DevOps, and Helping your Business Win; Gene Kim and Kevin Behr; Trade Select</li>
-<li>Buddah and Einstein walk into a Bar; Guy Joseph Ale, Claire Bloom; Blackstone Publishing</li>
-<li>Stop starting, start finishing; Arne Roock; Lean-Kanban University </li>
-<li>Eat That Frog; Brian Tracy</li>
-<li>Consciousness: A Very Short Introduction; Susan Blackmore; Oxford Uiversity Press</li>
-<li>The Joy of Missing Out; Christina Crook; New Society Publishers</li>
-<li>So Good They Can&#39;t Ignore You; Cal Newport; Business Plus</li>
<li>Never Split the Difference; Chris Voss, Tahl Raz; Random House Business</li>
+<li>Slow Productivity; Cal Newport; Penguin Random House</li>
<li>Soft Skills; John Sommez; Manning Publications</li>
-<li>The 7 Habits Of Highly Effective People; Stephen R. Covey; Simon &amp; Schuster UK</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>101 Essays that change the way you think; Brianna Wiest; Audible</li>
-<li>Getting Things Done; David Allen</li>
-<li>Deep Work; Cal Newport; Piatkus</li>
<li>Time Management for System Administrators; Thomas A. Limoncelli; O&#39;Reilly</li>
-<li>The Power of Now; Eckhard Tolle; Yellow Kite</li>
-<li>Eat That Frog!; Brian Tracy; Hodder Paperbacks</li>
-<li>The Daily Stoic; Ryan Holiday, Stephen Hanselman; Profile Books</li>
+<li>The Obstacle Is The Way; Ryan Holiday; Profile Books Ltd</li>
+<li>So Good They Can&#39;t Ignore You; Cal Newport; Business Plus</li>
+<li>Deep Work; Cal Newport; Piatkus</li>
+<li>Buddah and Einstein walk into a Bar; Guy Joseph Ale, Claire Bloom; Blackstone Publishing</li>
<li>Psycho-Cybernetics; Maxwell Maltz; Perigee Books</li>
-<li>The Complete Software Developer&#39;s Career Guide; John Sonmez; Unabridged Audiobook</li>
-<li>Influence without Authority; A. Cohen, D. Bradford; Wiley</li>
+<li>Solve for Happy; Mo Gawdat (RE-READ 1ST TIME)</li>
+<li>The Joy of Missing Out; Christina Crook; New Society Publishers</li>
+<li>The Off Switch; Mark Cropley; Virgin Books (RE-READ 1ST TIME)</li>
<li>The Good Enough Job; Simone Stolzoff; Ebury Edge</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>Who Moved My Cheese?; Dr. Spencer Johnson; Vermilion </li>
+<li>The Bullet Journal Method; Ryder Carroll; Fourth Estate</li>
+<li>The Complete Software Developer&#39;s Career Guide; John Sonmez; Unabridged Audiobook</li>
+<li>The Daily Stoic; Ryan Holiday, Stephen Hanselman; Profile Books</li>
+<li>Getting Things Done; David Allen</li>
+<li>Stop starting, start finishing; Arne Roock; Lean-Kanban University </li>
+<li>101 Essays that change the way you think; Brianna Wiest; Audible</li>
+<li>The Phoenix Project - A Novel About IT, DevOps, and Helping your Business Win; Gene Kim and Kevin Behr; Trade Select</li>
+<li>Consciousness: A Very Short Introduction; Susan Blackmore; Oxford Uiversity Press</li>
+<li>The Power of Now; Eckhard Tolle; Yellow Kite</li>
</ul><br />
<a class='textlink' href='../notes/index.html'>Here are notes of mine for some of the books</a><br />
<br />
@@ -157,31 +157,31 @@
<span>Some of these were in-person with exams; others were online learning lectures only. In random order:</span><br />
<br />
<ul>
-<li>The Well-Grounded Rubyist Video Edition; David. A. Black; O&#39;Reilly Online</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>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>Protocol buffers; O&#39;Reilly Online</li>
-<li>Scripting Vim; Damian Conway; O&#39;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&#39;Reilly Online</li>
<li>Structure and Interpretation of Computer Programs; Harold Abelson and more...; </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>Ultimate Go Programming; Bill Kennedy; O&#39;Reilly Online</li>
<li>AWS Immersion Day; Amazon; 1-day interactive online training </li>
-<li>Algorithms Video Lectures; Robert Sedgewick; O&#39;Reilly Online</li>
<li>Functional programming lecture; Remote University of Hagen</li>
-<li>Apache Tomcat Best Practises; 3-day on-site training</li>
+<li>Scripting Vim; Damian Conway; O&#39;Reilly Online</li>
+<li>MySQL Deep Dive Workshop; 2-day on-site training</li>
+<li>Algorithms Video Lectures; Robert Sedgewick; O&#39;Reilly Online</li>
+<li>Protocol buffers; O&#39;Reilly Online</li>
+<li>F5 Loadbalancers Training; 2-day on-site training; F5, Inc. </li>
<li>The Ultimate Kubernetes Bootcamp; School of Devops; O&#39;Reilly Online</li>
-<li>Developing IaC with Terraform (with Live Lessons); O&#39;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>Apache Tomcat Best Practises; 3-day on-site training</li>
+<li>The Well-Grounded Rubyist Video Edition; David. A. Black; O&#39;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>Raku Guide at https://raku.guide </li>
<li>Advanced Bash-Scripting Guide </li>
<li>How CPUs work at https://cpu.land</li>
+<li>Raku Guide at https://raku.guide </li>
</ul><br />
<h2 style='display: inline' id='podcasts'>Podcasts</h2><br />
<br />
@@ -190,58 +190,58 @@
<span>In random order:</span><br />
<br />
<ul>
-<li>BSD Now</li>
-<li>Deep Questions with Cal Newport</li>
-<li>Maintainable</li>
-<li>Hidden Brain</li>
+<li>Fallthrough [Golang]</li>
<li>The Changelog Podcast(s)</li>
+<li>Hidden Brain</li>
+<li>Dev Interrupted</li>
<li>The Pragmatic Engineer Podcast</li>
<li>Cup o&#39; Go [Golang]</li>
-<li>Backend Banter</li>
-<li>Fallthrough [Golang]</li>
-<li>Dev Interrupted</li>
-<li>The ProdCast (Google SRE Podcast)</li>
+<li>Maintainable</li>
<li>Fork Around And Find Out</li>
+<li>BSD Now</li>
+<li>Deep Questions with Cal Newport</li>
+<li>The ProdCast (Google SRE Podcast)</li>
+<li>Backend Banter</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>Go Time (predecessor of fallthrough)</li>
-<li>CRE: Chaosradio Express [german]</li>
-<li>FLOSS weekly</li>
<li>Java Pub House</li>
+<li>FLOSS weekly</li>
<li>Modern Mentor</li>
<li>Ship It (predecessor of Fork Around And Find Out)</li>
+<li>CRE: Chaosradio Express [german]</li>
+<li>Go Time (predecessor of fallthrough)</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>VK Newsletter</li>
<li>Ruby Weekly</li>
+<li>The Valuable Dev</li>
+<li>Golang Weekly</li>
<li>Applied Go Weekly Newsletter</li>
-<li>Register Spill</li>
+<li>VK Newsletter</li>
<li>Changelog News</li>
-<li>Andreas Brandhorst Newsletter (Sci-Fi author)</li>
-<li>Monospace Mentor</li>
+<li>Register Spill</li>
<li>The Pragmatic Engineer</li>
-<li>byteSizeGo</li>
+<li>Monospace Mentor</li>
<li>The Imperfectionist</li>
-<li>The Valuable Dev</li>
-<li>Golang Weekly</li>
+<li>Andreas Brandhorst Newsletter (Sci-Fi author)</li>
+<li>byteSizeGo</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>LWN (online only)</li>
-<li>Linux User</li>
<li>freeX (not published anymore)</li>
<li>Linux Magazine</li>
+<li>LWN (online only)</li>
+<li>Linux User</li>
</ul><br />
<h1 style='display: inline' id='formal-education'>Formal education</h1><br />
<br />
diff --git a/gemfeed/2024-06-23-terminal-multiplexing-with-tmux.html b/gemfeed/2024-06-23-terminal-multiplexing-with-tmux.html
index e39ce96c..cfbc6a53 100644
--- a/gemfeed/2024-06-23-terminal-multiplexing-with-tmux.html
+++ b/gemfeed/2024-06-23-terminal-multiplexing-with-tmux.html
@@ -2,7 +2,7 @@
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-<title>Terminal multiplexing with `tmux`</title>
+<title>Terminal multiplexing with `tmux` - Z-Shell edition</title>
<link rel="shortcut icon" type="image/gif" href="/favicon.ico" />
<link rel="stylesheet" href="../style.css" />
<link rel="stylesheet" href="style-override.css" />
@@ -11,9 +11,13 @@
<p class="header">
<a href="https://foo.zone">Home</a> | <a href="https://codeberg.org/snonux/foo.zone/src/branch/content-md/gemfeed/2024-06-23-terminal-multiplexing-with-tmux.md">Markdown</a> | <a href="gemini://foo.zone/gemfeed/2024-06-23-terminal-multiplexing-with-tmux.gmi">Gemini</a>
</p>
-<h1 style='display: inline' id='terminal-multiplexing-with-tmux'>Terminal multiplexing with <span class='inlinecode'>tmux</span></h1><br />
+<h1 style='display: inline' id='terminal-multiplexing-with-tmux---z-shell-edition'>Terminal multiplexing with <span class='inlinecode'>tmux</span> - Z-Shell edition</h1><br />
<br />
-<span class='quote'>Published at 2024-06-23T22:41:59+03:00</span><br />
+<span class='quote'>Published at 2024-06-23T22:41:59+03:00; Last updated 2025-05-02</span><br />
+<br />
+<span>This is the Z-Shell version. There is also a Fish version:</span><br />
+<br />
+<a class='textlink' href='./2025-05-02-terminal-multiplexing-with-tmux-fish-edition.html'>./2025-05-02-terminal-multiplexing-with-tmux-fish-edition.html</a><br />
<br />
<span>Tmux (Terminal Multiplexer) is a powerful, terminal-based tool that manages multiple terminal sessions within a single window. Here are some of its primary features and functionalities:</span><br />
<br />
@@ -40,7 +44,7 @@ jgs `-=========-`()
<h2 style='display: inline' id='table-of-contents'>Table of Contents</h2><br />
<br />
<ul>
-<li><a href='#terminal-multiplexing-with-tmux'>Terminal multiplexing with <span class='inlinecode'>tmux</span></a></li>
+<li><a href='#terminal-multiplexing-with-tmux---z-shell-edition'>Terminal multiplexing with <span class='inlinecode'>tmux</span> - Z-Shell edition</a></li>
<li>⇢ <a href='#before-continuing'>Before continuing...</a></li>
<li>⇢ <a href='#shell-aliases'>Shell aliases</a></li>
<li>⇢ <a href='#the-tn-alias---creating-a-new-session'>The <span class='inlinecode'>tn</span> alias - Creating a new session</a></li>
diff --git a/gemfeed/2025-05-02-terminal-multiplexing-with-tmux-fish-edition.html b/gemfeed/2025-05-02-terminal-multiplexing-with-tmux-fish-edition.html
new file mode 100644
index 00000000..b24f3b23
--- /dev/null
+++ b/gemfeed/2025-05-02-terminal-multiplexing-with-tmux-fish-edition.html
@@ -0,0 +1,410 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+<title>Terminal multiplexing with `tmux` - Fish edition</title>
+<link rel="shortcut icon" type="image/gif" href="/favicon.ico" />
+<link rel="stylesheet" href="../style.css" />
+<link rel="stylesheet" href="style-override.css" />
+</head>
+<body>
+<p class="header">
+<a href="https://foo.zone">Home</a> | <a href="https://codeberg.org/snonux/foo.zone/src/branch/content-md/gemfeed/2025-05-02-terminal-multiplexing-with-tmux-fish-edition.md">Markdown</a> | <a href="gemini://foo.zone/gemfeed/2025-05-02-terminal-multiplexing-with-tmux-fish-edition.gmi">Gemini</a>
+</p>
+<h1 style='display: inline' id='terminal-multiplexing-with-tmux---fish-edition'>Terminal multiplexing with <span class='inlinecode'>tmux</span> - Fish edition</h1><br />
+<br />
+<span class='quote'>Published at 2025-05-02T00:09:23+03:00</span><br />
+<br />
+<span>This is the Fish shell edition of the same post of mine from last year:</span><br />
+<br />
+<a class='textlink' href='./2024-06-23-terminal-multiplexing-with-tmux.html'>./2024-06-23-terminal-multiplexing-with-tmux.html</a><br />
+<br />
+<span>Tmux (Terminal Multiplexer) is a powerful, terminal-based tool that manages multiple terminal sessions within a single window. Here are some of its primary features and functionalities:</span><br />
+<br />
+<ul>
+<li>Session management</li>
+<li>Window and Pane management</li>
+<li>Persistent Workspace</li>
+<li>Customization</li>
+</ul><br />
+<a class='textlink' href='https://github.com/tmux/tmux/wiki'>https://github.com/tmux/tmux/wiki</a><br />
+<br />
+<pre>
+ _______
+ |.-----.|
+ || Tmux||
+ ||_.-._||
+ `--)-(--`
+ __[=== o]___
+ |:::::::::::|\
+jgs `-=========-`()
+ mod. by Paul B.
+</pre>
+<br />
+<h2 style='display: inline' id='table-of-contents'>Table of Contents</h2><br />
+<br />
+<ul>
+<li><a href='#terminal-multiplexing-with-tmux---fish-edition'>Terminal multiplexing with <span class='inlinecode'>tmux</span> - Fish edition</a></li>
+<li>⇢ <a href='#before-continuing'>Before continuing...</a></li>
+<li>⇢ <a href='#shell-aliases'>Shell aliases</a></li>
+<li>⇢ <a href='#the-tn-alias---creating-a-new-session'>The <span class='inlinecode'>tn</span> alias - Creating a new session</a></li>
+<li>⇢ ⇢ <a href='#cleaning-up-default-sessions-automatically'>Cleaning up default sessions automatically</a></li>
+<li>⇢ ⇢ <a href='#renaming-sessions'>Renaming sessions</a></li>
+<li>⇢ <a href='#the-ta-alias---attaching-to-a-session'>The <span class='inlinecode'>ta</span> alias - Attaching to a session</a></li>
+<li>⇢ <a href='#the-tr-alias---for-a-nested-remote-session'>The <span class='inlinecode'>tr</span> alias - For a nested remote session</a></li>
+<li>⇢ ⇢ <a href='#change-of-the-tmux-prefix-for-better-nesting'>Change of the Tmux prefix for better nesting</a></li>
+<li>⇢ <a href='#the-ts-alias---searching-sessions-with-fuzzy-finder'>The <span class='inlinecode'>ts</span> alias - Searching sessions with fuzzy finder</a></li>
+<li>⇢ <a href='#the-tssh-alias---cluster-ssh-replacement'>The <span class='inlinecode'>tssh</span> alias - Cluster SSH replacement</a></li>
+<li>⇢ ⇢ <a href='#the-tmuxtsshfromargument-helper'>The <span class='inlinecode'>tmux::tssh_from_argument</span> helper</a></li>
+<li>⇢ ⇢ <a href='#the-tmuxtsshfromfile-helper'>The <span class='inlinecode'>tmux::tssh_from_file</span> helper</a></li>
+<li>⇢ ⇢ <a href='#tssh-examples'><span class='inlinecode'>tssh</span> examples</a></li>
+<li>⇢ ⇢ <a href='#common-tmux-commands-i-use-in-tssh'>Common Tmux commands I use in <span class='inlinecode'>tssh</span></a></li>
+<li>⇢ <a href='#copy-and-paste-workflow'>Copy and paste workflow</a></li>
+<li>⇢ <a href='#tmux-configurations'>Tmux configurations</a></li>
+</ul><br />
+<h2 style='display: inline' id='before-continuing'>Before continuing...</h2><br />
+<br />
+<span>Before continuing to read this post, I encourage you to get familiar with Tmux first (unless you already know the basics). You can go through the official getting started guide:</span><br />
+<br />
+<a class='textlink' href='https://github.com/tmux/tmux/wiki/Getting-Started'>https://github.com/tmux/tmux/wiki/Getting-Started</a><br />
+<br />
+<span>I can also recommend this book (this is the book I got started with with Tmux):</span><br />
+<br />
+<a class='textlink' href='https://pragprog.com/titles/bhtmux2/tmux-2/'>https://pragprog.com/titles/bhtmux2/tmux-2/</a><br />
+<br />
+<span>Over the years, I have built a couple of shell helper functions to optimize my workflows. Tmux is extensively integrated into my daily workflows (personal and work). I had colleagues asking me about my Tmux config and helper scripts for Tmux several times. It would be neat to blog about it so that everyone interested in it can make a copy of my configuration and scripts.</span><br />
+<br />
+<span>The configuration and scripts in this blog post are only the non-work-specific parts. There are more helper scripts, which I only use for work (and aren&#39;t really useful outside of work due to the way servers and clusters are structured there).</span><br />
+<br />
+<span>Tmux is highly configurable, and I think I am only scratching the surface of what is possible with it. Nevertheless, it may still be useful for you. I also love that Tmux is part of the OpenBSD base system!</span><br />
+<br />
+<h2 style='display: inline' id='shell-aliases'>Shell aliases</h2><br />
+<br />
+<span>Since last week, I switched to the Fish shell. As a result, I also had to convert all my tmux helper scripts (mentioned in this blog post) to Fish.</span><br />
+<br />
+<a class='textlink' href='https://fishshell.com'>https://fishshell.com</a><br />
+<br />
+<span>For the most common Tmux commands I use, I have created the following shell aliases:</span><br />
+<br />
+<pre>
+alias tn &#39;tmux::new&#39;
+alias ta &#39;tmux::attach&#39;
+alias tx &#39;tmux::remote&#39;
+alias ts &#39;tmux::search&#39;
+alias tssh &#39;tmux::cluster_ssh&#39;
+alias tm tmux
+alias tl &#39;tmux list-sessions&#39;
+alias foo &#39;tmux::new foo&#39;
+alias bar &#39;tmux::new bar&#39;
+alias baz &#39;tmux::new baz&#39;
+</pre>
+<br />
+<span>Note all <span class='inlinecode'>tmux::...</span>; those are custom shell functions doing certain things, and they aren&#39;t part of the Tmux distribution. But let&#39;s run through every aliases one by one. </span><br />
+<br />
+<span>The first two are pretty straightforward. <span class='inlinecode'>tm</span> is simply a shorthand for <span class='inlinecode'>tmux</span>, so I have to type less, and <span class='inlinecode'>tl</span> lists all Tmux sessions that are currently open. No magic here.</span><br />
+<br />
+<h2 style='display: inline' id='the-tn-alias---creating-a-new-session'>The <span class='inlinecode'>tn</span> alias - Creating a new session</h2><br />
+<br />
+<span>The <span class='inlinecode'>tn</span> alias is referencing this function:</span><br />
+<br />
+<pre>
+# Create new session and if alread exists attach to it
+function tmux::new
+ set -l session $argv[1]
+ _tmux::cleanup_default
+ if test -z "$session"
+ tmux::new (string join "" T (date +%s))
+ else
+ tmux new-session -d -s $session
+ tmux -2 attach-session -t $session || tmux -2 switch-client -t $session
+ end
+end
+</pre>
+<br />
+<span>There is a lot going on here. Let&#39;s have a detailed look at what it is doing. </span><br />
+<br />
+<span>First, a Tmux session name can be passed to the function as a first argument. That session name is only optional. Without it, Tmux will select a session named <span class='inlinecode'>(string join "" T (date +%s))</span> as a default. Which is T followed by the UNIX epoch, e.g. <span class='inlinecode'>T1717133796</span>.</span><br />
+<br />
+<h3 style='display: inline' id='cleaning-up-default-sessions-automatically'>Cleaning up default sessions automatically</h3><br />
+<br />
+<span>Note also the call to <span class='inlinecode'>_tmux::cleanup_default</span>; it would clean up all already opened default sessions if they aren&#39;t attached. Those sessions were only temporary, and I had too many flying around after a while. So, I decided to auto-delete the sessions if they weren&#39;t attached. If I want to keep sessions around, I will rename them with the Tmux command <span class='inlinecode'>prefix-key $</span>. This is the cleanup function:</span><br />
+<br />
+<pre>
+function _tmux::cleanup_default
+ tmux list-sessions | string match -r &#39;^T.*: &#39; | string match -v -r attached | string split &#39;:&#39; | while read -l s
+ echo "Killing $s"
+ tmux kill-session -t "$s"
+ end
+end
+</pre>
+<br />
+<span>The cleanup function kills all open Tmux sessions that haven&#39;t been renamed properly yet—but only if they aren&#39;t attached (e.g., don&#39;t run in the foreground in any terminal). Cleaning them up automatically keeps my Tmux sessions as neat and tidy as possible. </span><br />
+<br />
+<h3 style='display: inline' id='renaming-sessions'>Renaming sessions</h3><br />
+<br />
+<span>Whenever I am in a temporary session (named <span class='inlinecode'>T....</span>), I may decide that I want to keep this session around. I have to rename the session to prevent the cleanup function from doing its thing. That&#39;s, as mentioned already, easily accomplished with the standard <span class='inlinecode'>prefix-key $</span> Tmux command.</span><br />
+<br />
+<h2 style='display: inline' id='the-ta-alias---attaching-to-a-session'>The <span class='inlinecode'>ta</span> alias - Attaching to a session</h2><br />
+<br />
+<span>This alias refers to the following function, which tries to attach to an already-running Tmux session.</span><br />
+<br />
+<pre>
+function tmux::attach
+ set -l session $argv[1]
+ if test -z "$session"
+ tmux attach-session || tmux::new
+ else
+ tmux attach-session -t $session || tmux::new $session
+ end
+end
+</pre>
+<br />
+<span>If no session is specified (as the argument of the function), it will try to attach to the first open session. If no Tmux server is running, it will create a new one with <span class='inlinecode'>tmux::new</span>. Otherwise, with a session name given as the argument, it will attach to it. If unsuccessful (e.g., the session doesn&#39;t exist), it will be created and attached to.</span><br />
+<br />
+<h2 style='display: inline' id='the-tr-alias---for-a-nested-remote-session'>The <span class='inlinecode'>tr</span> alias - For a nested remote session</h2><br />
+<br />
+<span>This SSHs into the remote server specified and then, remotely on the server itself, starts a nested Tmux session. So we have one Tmux session on the local computer and, inside of it, an SSH connection to a remote server with a Tmux session running again. The benefit of this is that, in case my network connection breaks down, the next time I connect, I can continue my work on the remote server exactly where I left off. The session name is the name of the server being SSHed into. If a session like this already exists, it simply attaches to it.</span><br />
+<br />
+<pre>
+function tmux::remote
+ set -l server $argv[1]
+ tmux new -s $server "ssh -A -t $server &#39;tmux attach-session || tmux&#39;" || tmux attach-session -d -t $server
+end
+</pre>
+<br />
+<h3 style='display: inline' id='change-of-the-tmux-prefix-for-better-nesting'>Change of the Tmux prefix for better nesting</h3><br />
+<br />
+<span>To make nested Tmux sessions work smoothly, one must change the Tmux prefix key locally or remotely. By default, the Tmux prefix key is <span class='inlinecode'>Ctrl-b</span>, so <span class='inlinecode'>Ctrl-b $</span>, for example, renames the current session. To change the prefix key from the standard <span class='inlinecode'>Ctrl-b</span> to, for example, <span class='inlinecode'>Ctrl-g</span>, you must add this to the <span class='inlinecode'>tmux.conf</span>:</span><br />
+<br />
+<pre>
+set-option -g prefix C-g
+</pre>
+<br />
+<span>This way, when I want to rename the remote Tmux session, I have to use <span class='inlinecode'>Ctrl-g $</span>, and when I want to rename the local Tmux session, I still have to use <span class='inlinecode'>Ctrl-b $</span>. In my case, I have this deployed to all remote servers through a configuration management system (out of scope for this blog post).</span><br />
+<br />
+<span>There might also be another way around this (without reconfiguring the prefix key), but that is cumbersome to use, as far as I remember. </span><br />
+<br />
+<h2 style='display: inline' id='the-ts-alias---searching-sessions-with-fuzzy-finder'>The <span class='inlinecode'>ts</span> alias - Searching sessions with fuzzy finder</h2><br />
+<br />
+<span>Despite the fact that with <span class='inlinecode'>_tmux::cleanup_default</span>, I don&#39;t leave a huge mess with trillions of Tmux sessions flying around all the time, at times, it can become challenging to find exactly the session I am currently interested in. After a busy workday, I often end up with around twenty sessions on my laptop. This is where fuzzy searching for session names comes in handy, as I often don&#39;t remember the exact session names.</span><br />
+<br />
+<!-- Generator: GNU source-highlight 3.1.9
+by Lorenzo Bettini
+http://www.lorenzobettini.it
+http://www.gnu.org/software/src-highlite -->
+<pre>function tmux::search
+ <b><u><font color="#000000">set</font></u></b> -l session (tmux list-sessions | fzf | cut -d: -f<font color="#000000">1</font>)
+ <b><u><font color="#000000">if</font></u></b> <b><u><font color="#000000">test</font></u></b> -z <font color="#808080">"$TMUX"</font>
+ tmux attach-session -t $session
+ <b><u><font color="#000000">else</font></u></b>
+ tmux switch -t $session
+ end
+end
+</pre>
+<br />
+<span>All it does is list all currently open sessions in <span class='inlinecode'>fzf</span>, where one of them can be searched and selected through fuzzy find, and then either switch (if already inside a session) to the other session or attach to the other session (if not yet in Tmux).</span><br />
+<br />
+<span>You must install the <span class='inlinecode'>fzf</span> command on your computer for this to work. This is how it looks like:</span><br />
+<br />
+<a href='./terminal-multiplexing-with-tmux/tmux-session-fzf.png'><img alt='Tmux session fuzzy finder' title='Tmux session fuzzy finder' src='./terminal-multiplexing-with-tmux/tmux-session-fzf.png' /></a><br />
+<br />
+<h2 style='display: inline' id='the-tssh-alias---cluster-ssh-replacement'>The <span class='inlinecode'>tssh</span> alias - Cluster SSH replacement</h2><br />
+<br />
+<span>Before I used Tmux, I was a heavy user of ClusterSSH, which allowed me to log in to multiple servers at once in a single terminal window and type and run commands on all of them in parallel.</span><br />
+<br />
+<a class='textlink' href='https://github.com/duncs/clusterssh'>https://github.com/duncs/clusterssh</a><br />
+<br />
+<span>However, since I started using Tmux, I retired ClusterSSH, as it came with the benefit that Tmux only needs to be run in the terminal, whereas ClusterSSH spawned terminal windows, which aren&#39;t easily portable (e.g., from a Linux desktop to macOS). The <span class='inlinecode'>tmux::cluster_ssh</span> function can have N arguments, where:</span><br />
+<br />
+<ul>
+<li>...the first argument will be the session name (see <span class='inlinecode'>tmux::tssh_from_argument</span> helper function), and all remaining arguments will be server hostnames/FQDNs to connect to simultaneously.</li>
+<li>...or, the first argument is a file name, and the file contains a list of hostnames/FQDNs (see <span class='inlinecode'>tmux::ssh_from_file</span> helper function)</li>
+</ul><br />
+<span>This is the function definition behind the <span class='inlinecode'>tssh</span> alias:</span><br />
+<span> </span><br />
+<pre>
+function tmux::cluster_ssh
+ if test -f "$argv[1]"
+ tmux::tssh_from_file $argv[1]
+ return
+ end
+ tmux::tssh_from_argument $argv
+end
+</pre>
+<br />
+<span>This function is just a wrapper around the more complex <span class='inlinecode'>tmux::tssh_from_file</span> and <span class='inlinecode'>tmux::tssh_from_argument</span> functions, as you have learned already. Most of the magic happens there.</span><br />
+<br />
+<h3 style='display: inline' id='the-tmuxtsshfromargument-helper'>The <span class='inlinecode'>tmux::tssh_from_argument</span> helper</h3><br />
+<br />
+<span>This is the most magic helper function we will cover in this post. It looks like this:</span><br />
+<br />
+<pre>
+function tmux::tssh_from_argument
+ set -l session $argv[1]
+ set first_server_or_container $argv[2]
+ set remaining_servers $argv[3..-1]
+ if test -z "$first_server_or_container"
+ set first_server_or_container $session
+ end
+
+ tmux new-session -d -s $session (_tmux::connect_command "$first_server_or_container")
+ if not tmux list-session | grep "^$session:"
+ echo "Could not create session $session"
+ retur