122 lines
3.9 KiB
Text
122 lines
3.9 KiB
Text
|
;;;;;
|
||
|
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: -->
|