;;;;;
title: Notstumpwm
tags: experiments, notion, wm, lua, config, stumpwm, lisp, archlinux, exherbo
date: 2013-05-24 00:10
format: md
;;;;;

I have just returned from an excursion into the land of
[exherbo](http://exherbo.org/), which is an awesome source-based
distro, and I found that while I was gone, something changed that made
[stumpwm](http://www.nongnu.org/stumpwm/) cause a segmentation fault
in X11 a few seconds after starting up.

I have tried everything I can think of to get it running again, but
alas, to no avail. So I started looking at alternatives again. Feeling
a little crazy I decided to give [notion](http://notion.sf.net)
another try. And it fits strangely well.

It's configured/extended in lua, which I'm not particularly fond of,
and it has a (in my opinion) crazy default configuration. **But** it
also allows Emacs-like key combinations out-of-the-box, which is a
very big plus in my book. So the quest to bring it closer to my
stumpwm setup has begun.

## Window layout

One of the nicest additions to my stumpwm configuration I made in the
last few weeks was a loaded window configuration which put my Emacs
frames in a big chunk of my left monitor, my terminals on my left
monitor with just enough space for 80 columns and my web browser
filling my right screen. I had also set-up some rules to always place
them in the correct spots.

I have not yet tried to automatically place the windows in the right
spots, but I do have the proportions right. I just had to delete the
right frames and resize the one for terminals and, by default, notion
remembers this set-up and automatically restores it when I log in.

I will look at creating a special layout for this so I don't have to
worry about (accidentally) changing things.

## run-or-raise

I found this interesting
[page](http://www.xsteve.at/prg/ion/ion3_functions_xsteve.lua) about
`run-or-raise`-like functionality for Ion3, which notion is a fork of.
This is a little outdated, though, since notion has changed
(apparently) the workings of some functions and lua 5.2 introduced the
goto keyword, so I had to change it to this:

```
function oni_match_class(class)
   local result = {}
   ioncore.clientwin_i(
      function (win)
         if class `` win:get_ident().class then
            table.insert(result, win)
            return false
         end
         return true
      end
   )
   return result
end

function xsteve_run_byclass(prog, class)
   local win = oni_match_class(class)[1]
   if win then
      win:goto_()
   else
      ioncore.exec(prog)
   end
end
```

There is no function to get a list of all the client windows, only a
function to iterate over them. For the moment I am only interested in
finding the first window with class CLASS, so I return `false` when a
match is found, this stops the iteration process. I also had to use
the `WRegion.goto_` function, instead of `WRegion.goto` because of the
mentioned change in lua 5.2, but they are the same.

I then only have to bind it:

```
defbindings("WScreen", {
    -- ...
    submap("Control+Z", {
        -- ...
        kpress("E", "xsteve_run_byclass('emacsclient -ca emacs', 'Emacs')"),
        kpress("W", "xsteve_run_byclass('conkeror', 'Conkeror')"),
        kpress("C", "xsteve_run_byclass('urxvt', 'URxvt')"),
    }),
})
```

## Quoting C-z

One of the coolest things about using a prefix in stumpwm that I have
been able to find in precious few other solutions is the ability to
send the prefix key to the applications you use, so you don't entirely
miss its functionality. In stumpwm this is easy, but in notion its a
little more work:

```
defbindings("WClientWin", {
    -- ...
    submap("Control+Z", {
        -- ...
        kpress("Q", "WClientWin.quote_next(_)"),
    }),
})
```

This means that I have to type `C-z q C-z` to send the `C-z` key to,
for instance, Emacs. That a few more keys than I was used to in
stumpwm, but at least it's possible.

<!-- Local Variables: -->
<!-- mode: markdown -->
<!-- End: -->
