summaryrefslogtreecommitdiffstats
path: root/articles/notstumpwm.org
blob: df63ded977817f57c699ce30534bf802d897bd55 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
#+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.