#!/usr/bin/perl
# Helper script to support quick window jumping with a prefix key for 0-9 in
# Tmux.
# At the moment Tmux doesn't support mappings with multiple keys, e.g. prefix
# ;0, prefix ;1 etc. (where ; is the common secondary prefix key). But this
# works in GNU screen and is very useful to switch to windows quickly, e.g.
# prefix ;3 to switch to window 13 or prefix ;;5 to switch to window 25.
#
# To simulate this missing feature ; and 0-9 must be rebound when prefix ; is
# used, and unbound when ; or 0-9 was pressed and the window selected. This
# script generates these tedious mappings.
#
# For each number (0-9) the following mapping is generated (example with 0):
#
# bind-key -n 0 unbind-key -n 0 \; \
# ...
# unbind-key -n 9 \; \
# unbind-key -n \\; \ # this unmaps ;
# select-window -t :10 \;
#
# Due to Tmux's handling of errors, they abort the rest of the mapping, the
# select-window command is executed as last part of the mapping.
#
# If a secondary chaining (e.g. prefix ;;3) is requested, a second file like
# the generated one must be loaded with ; to jump to windows 20-29. Therefore
# the following line is added in this case.
#
# bind-key -n \; source-file "/path/to/second/file"
#
# To use these mappings first create the files using this script. To switch to
# windows 10-19 with ;0-;9 and to 20-29 with ;;0-;;9 run these commands (can
# be chained indefinitely):
#
# $ perl ./tmux-window.pl 1 "`pwd`/tmux-window2.conf" > tmux-window1.conf
# $ perl ./tmux-window.pl 2 > tmux-window2.conf
#
# Then add the following to your tmux.conf:
#
# bind-key \; source-file "/path/to/tmux-window1.conf"
#
# tmux-window1.conf automatically contains the path to tmux-window2.conf,
# therefore chaining for ;;3 will work to jump to window 23.
# Copyright (C) 2012-2013 Simon Ruderich
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see .
use strict;
use warnings;
if (scalar @ARGV != 1 && scalar @ARGV != 2) {
print STDERR "Usage: $0 []\n";
exit 1;
}
my $level = $ARGV[0];
my $path = $ARGV[1];
if (defined $path and $path !~ m{^/}) {
print STDERR " must be an absolute path!\n";
exit 2;
}
for (my $i = 0; $i < 10; $i++) {
print "bind-key -n $i ";
for (my $j = 0; $j < 10; $j++) {
print "unbind-key -n $j \\; ";
}
print "unbind-key -n \\\\; \\; ";
# Do the select-window last. If the window doesn't exist the failing
# select-window command prevents unbinding the other keys.
print "select-window -t :$level$i\n";
}
if (defined $path) {
print "bind-key -n \\; source-file \"$path\"\n";
}