Monday, August 08, 2016

Tweaking Ratpoison: Less Mouse, Less Keystrokes, More Productivity

I'm probably one of the last production users of ratpoison, a Window Manager for Linux designed to avoid using the mouse. But I don't care, it's just brilliant software. When I initially set it up, I made a few tweaks (for example, setting Caps Lock as the Escape key) and pretty much left it alone.

Recently, I decided it was time to streamline things a bit. I found that I had a number of standard window configurations I was switching between (Work Browser + Xterm, Emacs + Development Browser, etc.) and I wanted a single keystroke to jump me to these. I experimented with fancy virtual desktops, but in the end, went with a simple solution.

First, I needed to make sure my .xmodmap configuration was setup correctly. Here's the code I have in place to map the Caps Lock key to Hyper and the Windows key to Super:

clear   lock 
clear   control
clear   mod1
clear   mod2
clear   mod3
clear   mod4
clear   mod5
keycode 66 = Hyper_L
add     control = Control_L Control_R
add     mod1 = Alt_L Alt_R Meta_L
add     mod2 = Num_Lock
add     mod3 = Hyper_L
add     mod4 = Super_L Super_R
add     mod5 = Mode_switch ISO_Level3_Shift

Next up, I set up the following new keystrokes in my .ratpoisonrc:

definekey top s-j exec rpwin restore J
definekey top s-k exec rpwin restore K
definekey top s-l exec rpwin restore L
definekey top s-h exec rpwin restore H
definekey top s-J exec rpwin capture J
definekey top s-K exec rpwin capture K
definekey top s-L exec rpwin capture L
definekey top s-H exec rpwin capture H

The H K L J keystrokes are inspired by vi, of course. Holding down Shift + Windows Key + J grabs whatever the current window configuration is and stores it (that is, it runs rpwin capture J). Pressing Windows Key + J updates the screen to re-show the stored window configuration. In other words, I now have four keystrokes I can quickly setup as different window configurations, and a fast way to access them. After a couple of weeks of use, I'm totally loving this.

Below is the rpwin script that captures and restores the window configuration.

#!/bin/bash

## A shell script for capturing / restoring ratpoison window configurations
RATPOISON=ratpoison
RP_SNAPSHOT=$HOME/.rp.snapshot

usage() {
  echo "Usage: `basename $0` {capture|restore}"
  exit 1
}

rp_cmd() {
  $RATPOISON -c "$@"
}

case "$1" in
  capture)
    if [ -n "$2" ] ; then
      loc=$2
    else
      loc='default'
    fi
    touch $RP_SNAPSHOT.$loc
    rp_cmd sfdump > $RP_SNAPSHOT.$loc
    ;;
  restore)
    if [ -n "$2" ] ; then
      loc=$2
    else
      loc='default'
    fi
    if [ -s $RP_SNAPSHOT.$loc ] ; then
      rp_cmd "sfrestore `cat $RP_SNAPSHOT.$loc`"
    else
      echo "Refusing to restore an empty snapshot"
      exit
    fi
    ;;
  *)
    usage
    ;;
esac

No comments:

Post a Comment