115 lines
4.2 KiB
Org Mode
115 lines
4.2 KiB
Org Mode
|
#+TITLE:
|
||
|
|
||
|
* Notstumpwm :notion:wm:lua:config:
|
||
|
|
||
|
I have just returned from an excursion into the land of [[http://exherbo.org/][exherbo]], which
|
||
|
is an awesome source-based distro, and I found that while I was gone,
|
||
|
something changed that made [[http://www.nongnu.org/stumpwm/][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 [[http://notion.sf.net][notion]] 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 [[http://www.xsteve.at/prg/ion/ion3_functions_xsteve.lua][page]] 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:
|
||
|
|
||
|
#+BEGIN_SRC lua
|
||
|
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
|
||
|
#+END_SRC
|
||
|
|
||
|
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:
|
||
|
|
||
|
#+BEGIN_SRC lua
|
||
|
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')"),
|
||
|
}),
|
||
|
})
|
||
|
#+END_SRC
|
||
|
|
||
|
*** 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:
|
||
|
|
||
|
#+BEGIN_SRC lua
|
||
|
defbindings("WClientWin", {
|
||
|
-- ...
|
||
|
submap("Control+Z", {
|
||
|
-- ...
|
||
|
kpress("Q", "WClientWin.quote_next(_)"),
|
||
|
}),
|
||
|
})
|
||
|
#+END_SRC
|
||
|
|
||
|
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.
|