I have recently added a few things to by wmii+ruby configuration that I wanted to share. These are:

  • start a program in a given view from bash prompt (authored by Dave O’Neill)
  • start a program in a given view using Alt-Shift-p (authored by Jean Richard)
  • start an xterm in a given view using Alt-Shift-Return
  • cache directory changes in a view, start an xterm in the view’s last directory using Alt-Apostrophe

The first two are not mine. Follow Dave’s link to get his changes, or look at my config.

To execute a program in a given view using Alt-Shift-p instead of Alt-Ctrl-y put this in your wmiirc-config.rb file:

use_binding "execute-program-with-tag", "MODKEY-Shift-p"

To start an xterm in a given view using Alt-Shift-Return add this to your wmiirc-config.rb file:

use_binding "execute-xterm-with-tag"

And grab the execute-xterm-with-tag from my modified standard-plugin.rb file.

The final feature needs a bit more explanation. I often work on multiple distinct projects. Each project has a unique space on my filesystem associated with it. I discovered that when I open a terminal in a view the first thing I have to do is cd work/<client name>/<task working on>. Since I already have a wmii view created for that client and task, it would be really nice if the window manager did that for me.

Say I am working for Acme Corp, and I have two projects that I am working on for them… parachute and anvil. I would have views for tags acme:para and acme:anvil, and respective work directories work/acme/parachute and work/acme/anvil. When I am in the acme:para view and I create a new xterm, I would like it to start up in the work/acme/parachute directory automatically.

To do this I had to modify how the builtin bash cd works:

    function cd () 
    { 
            builtin cd $@ \
            && \
            ( echo "ShellChangeDir $PWD" | wmiir write /event )
    }

… basically, for each successful cd command I generate a wmii event with the new working directory.

Next in wmiirc-config.rb I use these events to store the last directory that I entered.

    @view_pwd = {}
    register("ShellChangeDir", nil, nil) {|dir,|
        view = read("/view/name")
        @view_pwd[view] = dir
    }

Finally, I added a new shortcut – Alt-Apostrophe – to start a new terminal from the directory last used by that view:

    on_key("MODKEY-apostrophe") {
        require 'fileutils'
        term = plugin_config["standard"]["x-terminal-emulator"] || "xterm"
        view = read("/view/name")
        dir = @view_pwd[view]
        if dir != ""
            # LOGGER.debug "exec #{term} on #{view} in #{dir}"
            FileUtils.cd(dir) { |dir|
                system "wmiisetsid #{term} &"
            }
        else
            system "wmiisetsid #{term} &"
        end
    }

And that’s it. :)