Score:4

Remap a key combination to another combination, e.g. AltGr+C -> Ctrl+C, under Wayland

in flag

I basically want to ask this question, but for GNOME on Wayland. This means that answers involving AutoKey and xbindkeys wont work, as neither works under Wayland.

Background:

I would like to remap some keys to ultimately make better use of CapsLock.

My plan is to map CapsLock to AltGr, and then follow this to obtain vim-like keybindings. On Wayland, this remapping can be done through XKB files (see the link).

However, I would also like to use CapsLock for copy/pasting. Currently, I have it mapped to Ctrl (using XKB files). This makes CapsLock + C work smoothly throughout the system, and I would like to preserve this.

So: With CapsLock mapped to AltGr, I would like Capslock (= AltGr) + C to act as Ctrl + C.

My question:

Under Wayland, can I somehow bind AltGr + C to Ctrl + C?

(Without just rebinding AltGr to Ctrl, as that would defeat the purpose)

An alternative example with Q

In the XKB file for latin /usr/share/X11/xkb/symbols/latin, the following behavior is defined for my Q key:

key <AD01>  { [ q, Q, at, Greek_OMEGA ] };

This states that the key has four possible outputs:

  1. Pressed alone, it produces q.
  2. Pressed with Shift, it produces Q.
  3. Pressed with AltGr, it produces @.
  4. Pressed with AltGr + Shift, it produces Ω.

Essentially what I would like to achieve is that when Q is pressed with AltGr, it does not produce @ but Ctrl + Q.

vanadium avatar
cn flag
The "best answer" part in https://itectec.com/ubuntu/ubuntu-configure-caps-lock-as-altgr-and-arrows-like-in-vim/, changing xkb, will also work on Wayland.
in flag
@vanadium Thank you, yes, that I am aware of and use already. I have now added detail to clarify the question. If XKB can be used for the purpose described, that would be excellent news! Alas, I have no clue what syntax to experiment with.
vanadium avatar
cn flag
OK, the specificity is clearer now. That specific change will require some "fake typing" solution. There is `ydotool` and possibly some other tools. Binding then can be done from within your window manager instead of `xmodmap`. No experience myself, so that is why I cannot develop this in an answer for now.
Score:2
in flag

Several tools exist that may do this, like KMonad, Interception Tools, and keyd.

I've had complete success with keyd under Wayland, so I describe what I did with that. I suggest reading the short the README for inspiration. The deamon can do a lot more than what's used here.

The present solution does what I want, but circumvents using the AltGr detour. It treats CapsLock as Control everywhere, except in h ,j ,k , l, which it changes to arrow keys.

1. INSTALLATION

I build keyd from source, as that was easy. The next lines first install dependencies (including C compiler), downloads the source, builds and installs it, and enables it as service, and starts it and runs it at startup.

When done, it'll tell you where it installed what so you can delete it for uninstall. You can delete the source code after installation.

sudo apt install cmake libudev-dev
git clone https://github.com/rvaiya/keyd
cd keyd
make && sudo make install
sudo systemctl enable keyd && sudo systemctl start keyd

2. FIND THE NAME OF THE KEYBOARD YOU WANT TO REMAP

You should find the name of your keyboard, so we can make a remapping just for that. Run

sudo keyd -m

and press some keys. It'll show the name of the keyboard and the keys pressed. Note down the name. Mine was AT Translated Set 2 keyboard.

3. MAKE A CONFIGURATION FILE

Wherever, make a configuration file called whatever. We'll move it later. Let's say you use ~/my_keyboard.conf.

In it, put the following. The #'ed are comments that explains the behavior defined (the is updated for v2.1.1. I hope I didn't make any mistakes):

[ids]

*

[main]
### MAIN LAYER
    
# Make capslock activate the second layer:

capslock = layer(movement_layer)

### SECOND LAYER (called "movement_layer")

# Define the new layer, which while active
# by default treats every key as if Control was pressed,
# (":C" means the layer should inherit the Control layer),
# and overrides this default for only h, j, k and l, which
# are mapped to directions.

[movement_layer:C]

h = left
j = down
k = up
l = right

# In sum, in the main default layer, everything is standard, except
# when CapsLock is pressed, then the second layer is activated.
# When the second layer is activate, everything but h, j, k, l
# acts as if Control is held---e.g., c copies and v pastes,
# which we want, as we holding down CapsLock.)

4. COPY AND RENAME THE CONFIGURATION FILE AND RESTART KEYD

Next, we copy the configuration to the right location and name it properly, namely according to the keyboard we want to remap.

sudo cp ~/my_keyboard.conf /etc/keyd/AT\ Translated\ Set\ 2\ keyboard.conf

We then restart keyd so it loads the new configuration:

sudo systemctl restart keyd

You're now up and running :)

5. A TIP: CREATE AN ALIAS TO COPY CONFIG AND RESTART KEYD

I ended up playing a lot with the config files. I edited them in a subdirectory of my home folder, then copied them over and restarted.

To make this less of a hassle, in ~/.bash_aliases, I added

alias rekeyd='sudo cp ~/my_keyboard.conf /etc/keyd/AT\ Translated\ Set\ 2\ keyboard.conf && sudo systemctl restart keyd'
Kevin-Prichard avatar
ph flag
This works very well. Sometimes you don't know the name of a key, and there are two ways to find out- 1) List all available keys with `keyd list-keys | sort`, and 2) Display keys as they are pressed with `sudo keyd monitor`.
mangohost

Post an answer

Most people don’t grasp that asking a lot of questions unlocks learning and improves interpersonal bonding. In Alison’s studies, for example, though people could accurately recall how many questions had been asked in their conversations, they didn’t intuit the link between questions and liking. Across four studies, in which participants were engaged in conversations themselves or read transcripts of others’ conversations, people tended not to realize that question asking would influence—or had influenced—the level of amity between the conversationalists.