DEV Community

Cover image for Boost Your Linux Productivity: Remapping Useless Keys with Kanata
Shanu Kumawat
Shanu Kumawat

Posted on • Edited on

Boost Your Linux Productivity: Remapping Useless Keys with Kanata

The Problem: The Useless Caps Lock Key

We've all been there - accidentally hitting the Caps Lock key and suddenly shouting at our screens in ALL CAPS. This relic from the typewriter era takes up prime keyboard real estate but offers little value in return. What if we could transform this useless key into a productivity powerhouse?

Enter Kanata: Your Key Remapping Solution

Kanata is a powerful, cross-platform key remapper written in Rust. It allows you to redefine your keyboard layout at a low level, opening up a world of possibilities for customization and efficiency. With Kanata, we can:

  1. Remap the Caps Lock key to serve dual purposes:
    • Tap for Escape (perfect for Neovim users)
    • Hold for Control (easier access to common shortcuts)
  2. Transform the Tab key into a symbol layer accessor:
    • Tap for normal Tab functionality
    • Hold to access a custom layer of symbols and navigation keys

Let's dive into how we can achieve this setup.

Step-by-Step Guide

1. Install Kanata

First, you'll need to install Kanata. The installation process varies depending on your Linux distribution. Check the official Kanata repository for detailed installation instructions.

2. Create Your Kanata Configuration File

Create a new file named kanata.kbd in your home directory. This is where we'll define our custom keyboard layout.

3. Define Your Source Layer

Start by defining your source layer. This represents your physical keyboard layout:

(defsrc
esc  f1   f2   f3   f4   f5   f6   f7   f8   f9   f10  f11  f12
grv  1    2    3    4    5    6    7    8    9    0    -    =    bspc
tab  q    w    e    r    t    y    u    i    o    p    [    ]    
caps a    s    d    f    g    h    j    k    l    ;    '    ret
lsft z    x    c    v    b    n    m    ,    .    /    rsft
lctl lmet lalt           spc            ralt rmet rctl
)

Enter fullscreen mode Exit fullscreen mode

This layout represents a standard QWERTY keyboard. Adjust it if your physical layout differs.

4. Create Custom Aliases

Next, we'll define aliases for our custom key behaviors:

(defalias
cec (tap-hold 200 200 esc lctl)
sym (tap-hold 200 200 tab (layer-toggle symbols))
)
Enter fullscreen mode Exit fullscreen mode

Here's what these aliases do:

  • cec: Caps as Escape (tap) and Control (hold)
  • sym: Tab as normal Tab (tap) and Symbol layer toggle (hold)

The numbers (200 200) represent the tap and hold timeouts in milliseconds.

5. Define Your Default Layer

Now, let's create our default layer, incorporating our new aliases:

(deflayer default
esc  f1   f2   f3   f4   f5   f6   f7   f8   f9   f10  f11  f12
grv  1    2    3    4    5    6    7    8    9    0    -    =    bspc
@sym q    w    e    r    t    y    u    i    o    p    [    ]    
@cec a    s    d    f    g    h    j    k    l    ;    '    ret
lsft z    x    c    v    b    n    m    ,    .    /    rsft
lctl lmet lalt           spc            ralt rmet rctl
)
Enter fullscreen mode Exit fullscreen mode

Note how we've replaced tab with @sym and caps with @cec.

6. Create Your Symbol Layer

Finally, let's define our symbol layer:

(deflayer symbols
  _    _    _    _    _    _    _    _    _    _    _    _    _
  _    S-1  S-2  S-3  S-4  S-5  S-6  S-7  S-8  S-9  S-0  _    _    _
  _    S-5  S-6  S-7  S-8  _    _    _    _    S-9  S-0  _    _    _
  _    _    _    del  _    _    left down up   rght _    _    _
  _    _    _    _    _    _    _    _    _    _    _    _
  _    _    _              _              _    _    _
)

Enter fullscreen mode Exit fullscreen mode

In this layer:

  • S- represents Shift, so S-1 outputs !, S-2 outputs @, etc.
  • We've added arrow key functionality to h, j, k, l for vim-style navigation
  • del is now easily accessible on the home row

So at the end you config should look like this:

(defsrc
  esc  f1   f2   f3   f4   f5   f6   f7   f8   f9   f10  f11  f12
  grv  1    2    3    4    5    6    7    8    9    0    -    =    bspc
  tab  q    w    e    r    t    y    u    i    o    p    [    ]    \
  caps a    s    d    f    g    h    j    k    l    ;    '    ret
  lsft z    x    c    v    b    n    m    ,    .    /    rsft
  lctl lmet lalt           spc            ralt rmet rctl
)

(defalias
  cec (tap-hold 200 200 esc lctl)
  sym (tap-hold 200 200 tab (layer-toggle symbols))
)

(deflayer default
  esc  f1   f2   f3   f4   f5   f6   f7   f8   f9   f10  f11  f12
  grv  1    2    3    4    5    6    7    8    9    0    -    =    bspc
  @sym q    w    e    r    t    y    u    i    o    p    [    ]    \
  @cec a    s    d    f    g    h    j    k    l    ;    '    ret
  lsft z    x    c    v    b    n    m    ,    .    /    rsft
  lctl lmet lalt           spc            ralt rmet rctl
)

(deflayer symbols
  _    _    _    _    _    _    _    _    _    _    _    _    _
  _    S-1  S-2  S-3  S-4  S-5  S-6  S-7  S-8  S-9  S-0  _    _    _
  _    S-5  S-6  S-7  S-8  _    _    _    _    S-9  S-0  _    _    _
  _    _    _    del  _    _    left down up   rght _    _    _
  _    _    _    _    _    _    _    _    _    _    _    _
  _    _    _              _              _    _    _
)

Enter fullscreen mode Exit fullscreen mode

7. Run Kanata

Save your kanata.kbd file and run Kanata:

kanata -c /path/to/your/kanata.kbd
Enter fullscreen mode Exit fullscreen mode

Instructions

In Linux, kanata needs to be able to access the input and uinput subsystem to inject events. To do this, your user needs to have permissions. Follow the steps in this page to obtain user permissions.

1. If the uinput group does not exist, create a new group

sudo groupadd uinput
Enter fullscreen mode Exit fullscreen mode

2. Add your user to the input and the uinput group

sudo usermod -aG input $USER
sudo usermod -aG uinput $USER
Enter fullscreen mode Exit fullscreen mode

Make sure that it's effective by running groups. You might have to logout and login.

3. Make sure the uinput device file has the right permissions.

Create a new file:

/etc/udev/rules.d/99-input.rules

Insert the following in the code

KERNEL=="uinput", MODE="0660", GROUP="uinput", OPTIONS+="static_node=uinput"
Enter fullscreen mode Exit fullscreen mode

Machine reboot or run this to reload

sudo udevadm control --reload-rules && sudo udevadm trigger
Enter fullscreen mode Exit fullscreen mode

Verify settings by following command:

ls -l /dev/uinput
Enter fullscreen mode Exit fullscreen mode

Output:

crw-rw---- 1 root date uinput /dev/uinput
Enter fullscreen mode Exit fullscreen mode

4. Make sure the uinput drivers are loaded

You may need to run this command whenever you start kanata for the first time:

sudo modprobe uinput
Enter fullscreen mode Exit fullscreen mode

5a. To create and enable a systemd daemon service

Run this command first:

mkdir -p ~/.config/systemd/user
Enter fullscreen mode Exit fullscreen mode

Then add this to: ~/.config/systemd/user/kanata.service:

[Unit]
Description=Kanata keyboard remapper
Documentation=https://github.com/jtroo/kanata

[Service]
Environment=PATH=/usr/local/bin:/usr/local/sbin:/usr/bin:/bin
Environment=DISPLAY=:0
Type=simple
ExecStart=/usr/bin/sh -c 'exec $$(which kanata) --cfg $${HOME}/.config/kanata/config.kbd'
Restart=no

[Install]
WantedBy=default.target
Enter fullscreen mode Exit fullscreen mode

Make sure to update the executable location for sh in the snippet above.
This would be the line starting with ExecStart=/usr/bin/sh -c.
You can check the executable path with:

which sh
Enter fullscreen mode Exit fullscreen mode

Then run:

systemctl --user daemon-reload
systemctl --user enable kanata.service
systemctl --user start kanata.service
systemctl --user status kanata.service   # check whether the service is running
Enter fullscreen mode Exit fullscreen mode

Conclusion

With this setup, you've transformed your Caps Lock and Tab keys into productivity powerhouses:

  • Tap Caps Lock for Escape, hold for Control
  • Tap Tab for normal Tab, hold to access your symbol layer

This configuration is especially powerful for Neovim users, providing quick access to Escape, and for developers who frequently use symbols and navigation keys.

Remember, this is just the beginning. Kanata offers a wealth of customization options. Experiment, refine, and create a keyboard layout that perfectly suits your workflow.

Happy typing!

About the Author

Hi, I'm Shanu Kumawat, a Flutter developer passionate about crafting seamless and beautiful mobile applications. Currently, I'm diving deeper into expanding my tech stack by learning Elixir and Phoenix, embracing the world of functional programming and scalable web development.

When I'm not coding, I enjoy exploring innovative technologies and sharing knowledge with the community. Connect with me on GitHub, Twitter, or LinkedIn to collaborate and grow together!

Top comments (1)

Collapse
 
shanu-kumawat profile image
Shanu Kumawat

Any suggestions for next post?