X-Git-Url: https://ruderich.org/simon/gitweb/?p=config%2Fdotfiles.git;a=blobdiff_plain;f=shell%2Ftmux-window.pl;fp=shell%2Ftmux-window.pl;h=5e2601c599b3f0842da08517794eeaa0ec61c00a;hp=0000000000000000000000000000000000000000;hb=29fe133e2b4ca2a25342fa9a4c3e661bc38895f2;hpb=3e17e82d591782b4750382b00c5bf6ee96eddedf diff --git a/shell/tmux-window.pl b/shell/tmux-window.pl new file mode 100644 index 0000000..5e2601c --- /dev/null +++ b/shell/tmux-window.pl @@ -0,0 +1,93 @@ +#!/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"; +}