Navigating the cursor across long lines of text by keyboard in Emacs can be
cumbersome, since commands like forward-char
, backward-char
, forward-word
,
and backward-word
move the cursor linearly, and potentially require a lot of
repeated executions to arrive at the desired position. bln-mode
addresses this
issue. It defines the commands bln-forward-half
and bln-backward-half
that allow for
navigating from any position in a line to any other position in that line by
recursive binary subdivision.
For instance, if the cursor is at position K, invoking bln-backward-half
will move
the cursor to position K/2. Successively invoking bln-forward-half
will move the
cursor to K/2 + K/4, whereas a second invocation of bln-backward-half
would move
the cursor to K/2 - K/4.
Below is an illustration of how you can use binary line navigation to reach
character e
at column 10 from character b
at column 34 in four steps:
+----------------+ bln-backward-half
|
+--------+ bln-backward-half
|
+---+ bln-forward-half
|
+-+ bln-backward-half
|
..........e.......................b.....
This approach requires at most log(N) invocations to move from any position to
any other position in a line of N characters. Note that when you move in the
wrong direction---by mistakenly invoking bln-backward-half
instead of
bln-forward-half
or vice versa---you can interrupt the current binary navigation
sequence by moving the cursor away from its current position (for example, by
forward-char
). You can then start the binary navigation again from that cursor
position.
M-x package-install bln-mode
Download the HEAD of repository and install with:
M-x package-install-file.
The default keybindings are as follows:
Command | Key |
---|---|
bln-backward-half |
C-c . j |
bln-forward-half |
C-c . k |
bln-backward-half-v |
C-c , j |
bln-forward-half-v |
C-c , k |
bln-backward-half-b |
C-c . h |
bln-forward-half-b |
C-c . l |
Navigation using thse keybindings is rather cumbersome
however. Using the hydra
package, the following bindings
provide a much more convenient interface:
(defhydra hydra-bln ()
"Binary line navigation mode"
("j" bln-backward-half "Backward in line")
("k" bln-forward-half "Forward in line")
("u" bln-backward-half-v "Backward in window")
("i" bln-forward-half-v "Forward in window")
("h" bln-backward-half-b "Backward in buffer")
("l" bln-forward-half-b "Forward in buffer"))
(define-key bln-mode-map (kbd "M-j") ’hydra-bln/body)
In this setup you press M-j to start the navigation, and press any sequence of j, k, u, i, h, l to navigate. Any other key will terminate the navigation.