TIL: Automating Command Execution Across All Tmux Panes
Posted on June 30, 2023 in Tmux
As developers, we often find ourselves working in multiple tmux panes, each
running different applications or instances of the same application. When we
make changes to a configuration file, such as ~/.vimrc
for Vim or ~/.aliases
for our shell, we need to manually reload that configuration in each relevant
instance. This can be a time-consuming process, especially when working with a
large number of panes. But also, let's be wizards and automate this process!
In this post, we'll explore a simple automation that can save you a lot of time
and effort. We'll focus on a specific use case — reloading a .vimrc
file across all Vim instances in tmux panes — but the pattern can be
applied to a variety of scenarios.
The Solution
Here's a shell function that reloads the .vimrc
file in all Vim instances
across all tmux panes:
function reload-all-vim() {
tmux list-panes -aF "#{pane_id} #{pane_current_command}" |
awk '/vim|nvim/ {print $1}' |
xargs -I {} tmux send-keys -t {} "C-[" ":so ~/.vimrc" "C-m"
}
Let's break down this function:
tmux list-panes -aF "#{pane_id} #{pane_current_command}"
: This command lists all panes across all tmux sessions and windows. For each pane, it prints the pane ID and the current command running in the pane.awk '/vim|nvim/ {print $1}'
: This command filters the output to only include lines where the current command is eithervim
ornvim
, and then it prints the pane ID of those panes.xargs -I {} tmux send-keys -t {} "C-[" ":so ~/.vimrc" "C-m"
: This command takes the pane IDs output byawk
and for each pane ID, it sends a series of keys to that pane. The keys are:C-[
(equivalent to theEsc
key) ensuring we're in normal mode:so ~/.vimrc
the command to reload the.vimrc
file, andC-m
(equivalent to theEnter
key) executing the command
Conclusion
With this pattern, you can automate the process of propagating configuration changes to all relevant instances across all tmux panes. This will save you the time and effort of manually reloading configurations, allowing you to focus more on your work and less on configuration management.
The pattern used in this function can be applied to a variety of scenarios. Here are some examples:
- Reloading Shell Aliases: If you update your
~/.aliases
file, you can use a similar function to source this file in all shell panes. - Updating Environment Variables: If you change an environment variable in your
~/.bashrc
or~/.zshrc
file, you can propagate this change to all shell panes. - Updating Git Configuration: If you change your Git configuration, you can use a similar function to propagate this change to all shell panes where you might run Git commands.