Binwarp (binary mouse warping) is a new keymap and mode that enables you to (almost) get rid of mouse and go even more keyboard-driven! Moreover, with enough muscle memory, you can be even more productive than with mouse, because Binwarp uses a divide-and-conquer approach and splits the screen in two on every `binwarp` you make. Given that, you can reach any pixel on your screen in less than 12 keypresses (on 1920x1080 screen), but you would rarely need exact pixels, so it’s even less keypresses!
This mode is somewhat similar to the software called keynav, with the notable advantage that Binwarp is written on top of StumpWM and all the configuration can be done in Common Lisp, which is much more comfortable than configuring some non-lispy external tool.
To start using Binwarp, just load it into your StumpWM setup by adding either
(load-module "binwarp")
or
(asdf:load-system :binwarp)
to your config file.
Then you need to explicitly create a binding for Binwarp, using `define-binwarp-mode`.
(binwarp:define-binwarp-mode your-binwarp-mode-name "X" (:map *root-map*)
((kbd "RET") "ratclick 1")
((kbd "SPC") "ratclick 3"))
This example snippet creates an interactive keymap named your-binwarp-mode-name
and binds
it to C-t X
(in case your *root-map*
prefix key is C-t
), while adding the left mouse-click
to the default binwarp keymap as RET
key, and right mouse-click as SPC
.
You can look at define-binwarp-mode
documentation to learn its capabilities.
Binwarp exports a bunch of special variables that influence its behavior in a way that can suit your workflow. The list is:
*reinitiate-ptr*
*init-ptr-position*
*preserve-history*
See the respective documentation for the ways they can be used to enhance your binwarping!
Also, there is *default-binwarp-keymap*
that you can alter to enable different keys for binwarping,
although using define-binwarp-mode
seems more straightforward to me.
Due to Binwarp being an interactive-keymap
, there are some problems with using it
together with the remapped keys, and some keypresses can never get to Binwarp,
sometimes with the terrible consequence that you won’t be able to disable Binwarp
or accidentaly destroy some part of your setup (only the former happened to me
and I hope that latter is just a joke).
To get around this, you can use lambda
-s as the conditions for your
define-remapped-keys
and include binwarp*binwarp-mode-p*
as one of the
conditions for these remapped keys to not work for.
For example, if you remap keys for Firefox (as I do), then your configuration should look like this:
(define-remapped-keys
`((,(lambda (win)
(and (member (window-class win)
'("Firefox" "IceCat" "Nightly")
:test #'string-equal)
(not binwarp:*binwarp-mode-p*)))
... your bindings ...)))
Binwarp have two general mouse-related utils:
with-pointer
, macro that binds the mouse coordinates to the variables you name, and runs the given macro body in the scope where these variables are accessible.randwarp
, command for random mouse warping in a given direction. I can’t come up with a good
use-case for that, but it’s fun and gives your mouse-related experience a bit of cool randomness :)
If you have ideas on the mouse-related utils that you want to see in Binwarp, you’re welcome to suggest or even add them!
- [ ] Add per-window binwarping.
- [ ] Make
*binwarp-history*
tree-like, instead of list, to never lose the track of where you’ve been. - [ ] Make documentation clearer (because documentation is never exhaustive).
- [ ] Integrate Binwarp into StumpWM (?) or come up with a simple way to use both Binwarp
and
define-remapped-keys
without shooting your feet off. - [ ] Use different directions from the ones provided by StumpWM.
:top-left
and similar ones would be especially handy for fast navigation. - [ ] Add the mouse keybindings (e.g.,
ratclick 1
andratclick 3
) to the*default-binwarp-keymap*
.