Added proper keyboard remapping.

This commit is contained in:
Scott Duensing 2025-06-08 19:32:41 -05:00
parent 8952696c5f
commit faaffd5955
280 changed files with 98603 additions and 9 deletions

2
cros-keyboard-map/.gitignore vendored Normal file
View file

@ -0,0 +1,2 @@
cros.conf
pkg.log

28
cros-keyboard-map/LICENSE Normal file
View file

@ -0,0 +1,28 @@
BSD 3-Clause License
Copyright (c) 2023, WeirdTreeThing
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
3. Neither the name of the copyright holder nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

View file

@ -0,0 +1,18 @@
<h1 align="center">Utility to generate keyd configurations for use on Chromebooks</h1>
## List of supported distributions
- Alpine
- Arch Linux
- Chimera Linux
- Debian
- Fedora
- openSUSE
- Ubuntu
- Void Linux
### Instructions
1. git clone https://github.com/WeirdTreeThing/cros-keyboard-map
2. cd cros-keyboard-map
3. ./install.sh
Thanks to rvaiya for creating [keyd](https://github.com/rvaiya/keyd).

View file

@ -0,0 +1,3 @@
evdev:atkbd:dmi:bvn*:bvr*:bd*:svnGoogle:pn*:pvr*
KEYBOARD_KEY_d8=leftmeta

View file

@ -0,0 +1,44 @@
[ids]
# Pixelbook and Pixelbook Go use AT Keyboard (0001:0001)
# Nocturne uses Google hammer (18d1:5030)
0001:0001
18d1:5030
[main]
f1 = back
f2 = refresh
f3 = f11
f4 = scale
f5 = brightnessdown
f6 = brightnessup
f7 = playpause
f8 = mute
f9 = volumedown
f10 = volumeup
f13 = f13
[meta]
f1 = f1
f2 = f2
f3 = f3
f4 = f4
f5 = f5
f6 = f6
f7 = f7
f8 = f8
f9 = f9
f10 = f10
f13 = f13
[alt]
backspace = delete
f5 = kbdillumdown
f6 = kbdillumup
[control]
f5 = print
[control+alt]
backspace = C-A-delete

View file

@ -0,0 +1,39 @@
# Config for Sarien and its variant, Arcada
[ids]
# AT keyboard is device 0001:0001
0001:0001
[main]
back = back
refresh = refresh
zoom = f11
scale = scale
print = print
camera = brightnessdown
prog1 = brightnessup
mute = mute
volumedown = volumedown
volumeup = volumeup
sleep = coffee
[meta]
back = f1
refresh = f2
zoom = f3
scale = f4
camera = f5
prog1 = f6
mute = f7
volumedown = f8
volumeup = f9
switchvideomode = f12
[alt]
backspace = delete
meta = capslock
camera = kbdillumdown
prog1 = kbdillumup
[control+alt]
backspace = C-A-delete

View file

@ -0,0 +1,186 @@
#!/usr/bin/env python3
import argparse
import platform
device_ids = {
"k:0000:0000", # cros_ec keyboard
"k:0001:0001", # AT keyboard
"k:18d1:503c", # Google Inc. Hammer
"k:18d1:5050", # Google Inc. Hammer
"k:18d1:504c", # Google Inc. Hammer
"k:18d1:5052", # Google Inc. Hammer
"k:18d1:5057", # Google Inc. Hammer
"k:18d1:505b", # Google Inc. Hammer
"k:18d1:5030", # Google Inc. Hammer
"k:18d1:503d", # Google Inc. Hammer
"k:18d1:5044", # Google Inc. Hammer
"k:18d1:5061", # Google Inc. Hammer
"k:18d1:502b", # Google Inc. Hammer
}
vivaldi_keys = {
"x86_64": {
"90": "previoussong",
"91": "zoom",
"92": "scale",
"93": "sysrq",
"94": "brightnessdown",
"95": "brightnessup",
"97": "kbdillumdown",
"98": "kbdillumup",
"99": "nextsong",
"9A": "playpause",
"9B": "micmute",
"9E": "kbdillumtoggle",
"A0": "mute",
"AE": "volumedown",
"B0": "volumeup",
"E9": "forward",
"EA": "back",
"E7": "refresh",
},
"arm": {
"158": "back",
"159": "forward",
"173": "refresh",
"372": "zoom",
"120": "scale",
"224": "brightnessdown",
"225": "brightnessup",
"113": "mute",
"114": "volumedown",
"115": "volumeup",
"99" : "sysrq",
}
}
def get_arch():
return platform.uname().machine
def get_ids_string(device_ids):
return "\n".join(device_ids)
def get_dt_layout():
keys = []
keycodes = []
fdt = libfdt.Fdt(open("/sys/firmware/fdt", "rb").read())
currentnode = fdt.first_subnode(0)
while True:
try:
if fdt.get_name(currentnode) == "keyboard-controller":
prop = fdt.getprop(currentnode, "linux,keymap")
keys = prop.as_uint32_list()
currentnode = fdt.next_node(currentnode, 10)[0]
except:
break
if not keys:
return ""
for key in keys:
keycode = str(key & 0xFFFF)
if keycode in vivaldi_keys["arm"]:
keycodes.append(keycode)
return keycodes
def get_physmap_data():
if get_arch() == "x86_64":
try:
with open("/sys/bus/platform/devices/i8042/serio0/function_row_physmap", "r") as file:
return file.read().strip().split()
except FileNotFoundError:
return ""
else:
return get_dt_layout()
def get_functional_row(physmap, use_vivaldi, super_is_held, super_inverted):
arch = get_arch()
if arch != "x86_64":
arch = "arm"
i = 0
result = ""
for code in physmap:
i += 1
# Map zoom to f11 since most applications wont listen to zoom
mapping = "f11" if vivaldi_keys[arch][code] == "zoom" \
else vivaldi_keys[arch][code]
match [super_is_held, use_vivaldi, super_inverted]:
case [True, True, False] | [False, True, True]:
result += f"{vivaldi_keys[arch][code]} = f{i}\n"
case [True, False, False] | [False, False, True]:
result += f"f{i} = f{i}\n"
case [False, True, False] | [True, True, True]:
result += f"{vivaldi_keys[arch][code]} = {mapping}\n"
case [False, False, False] | [True, False, True]:
result += f"f{i} = {mapping}\n"
return result
def get_keyd_config(physmap, inverted):
config = f"""\
[ids]
{get_ids_string(device_ids)}
[main]
{get_functional_row(physmap, use_vivaldi=False, super_is_held=False, super_inverted=inverted)}
{get_functional_row(physmap, use_vivaldi=True, super_is_held=False, super_inverted=inverted)}
f13=coffee
sleep=coffee
[meta]
{get_functional_row(physmap, use_vivaldi=False, super_is_held=True, super_inverted=inverted)}
{get_functional_row(physmap, use_vivaldi=True, super_is_held=True, super_inverted=inverted)}
[alt]
backspace = delete
brightnessdown = kbdillumdown
brightnessup = kbdillumup
f6 = kbdillumdown
f7 = kbdillumup
[control]
f5 = sysrq
scale = sysrq
[altgr]
backspace = delete
left = home
right = end
up = pageup
down = pagedown
[control+alt]
backspace = C-A-delete
"""
return config
def main():
parser = argparse.ArgumentParser()
parser.add_argument("-f", "--file", default="cros.conf", help="path to save config (default: cros.conf)")
parser.add_argument("-i", "--inverted", action="store_true",
help="use functional keys by default and media keys when super is held")
args = vars(parser.parse_args())
physmap = get_physmap_data()
if not physmap:
print("no function row mapping found, using default mapping")
if get_arch() == "x86_64":
physmap = ['EA', 'E9', 'E7', '91', '92', '94', '95', 'A0', 'AE', 'B0']
else:
physmap = ['158', '159', '173', '372', '120', '224', '225', '113', '114', '115']
config = get_keyd_config(physmap, args["inverted"])
with open(args["file"], "w") as conf:
conf.write(config)
if __name__ == "__main__":
if get_arch() != "x86_64":
import libfdt
main()

167
cros-keyboard-map/install.sh Executable file
View file

@ -0,0 +1,167 @@
#!/bin/bash
set -e
# void, alpine, arch, and suse have packages
# need to build on fedora (without terra) and debian/ubuntu
ROOT=$(pwd)
# fancy color
printf "\033[94m"
if [ -f /usr/bin/apt ]; then
distro="deb"
elif [ -f /usr/bin/zypper ]; then
distro="suse"
elif [ -f /usr/bin/pacman ]; then
distro="arch"
elif [ -f /usr/bin/dnf4 ]; then
distro="fedora"
elif [ -f /sbin/apk ]; then
distro="alpine"
elif [ -f /bin/xbps-install ]; then
distro="void"
elif grep 'ID=nixos' /etc/os-release &>> pkg.log; then
echo "WARNING: This script will not install keyd on NixOS, but can install the configuration for you."
printf "Continue? (y/N) "
read -r NIXINSTALL
[[ $NIXINSTALL =~ ^[Yy]$ ]] || exit 1
distro="nixos"
fi
if which sudo &>/dev/null; then
privesc="sudo"
elif which doas &>/dev/null; then
privesc="doas"
elif which run0 &>/dev/null; then
privesc="run0"
fi
echo "Installing, this may take some time...."
# Fedora with the terra repo (Ultramarine) has keyd packaged
[ "$distro" = "fedora" ] && dnf4 info keyd -y&>> pkg.log && FEDORA_HAS_KEYD=1
if ! which keyd &>/dev/null && [ "$distro" != "nixos" ] ; then
build_keyd=1
# if keyd isnt installed
# Debian-based distros and Fedora don't have keyd in the repos, ask the user to compile it from source.
if [ "distro" = "fedora" ] && [ ! "$FEDORA_HAS_KEYD" = "1" ] || [ "$distro" = "deb" ]; then
echo "This script can compile keyd for you or you can choose to get it from another source."
printf "Compile keyd? (Y/n) "
read -r COMPKEYD
[[ $COMPKEYD =~ ^[Nn]$ ]] && build_keyd=0
fi
if [ "$build_keyd" = "1" ]; then
echo "Installing keyd dependencies"
case $distro in
deb)
$privesc apt install -y build-essential git &>> pkg.log
;;
fedora)
[ ! "$FEDORA_HAS_KEYD" = "1" ] && $privesc dnf4 install -y kernel-headers gcc make &>> pkg.log
;;
esac
fi
if ( [ "distro" = "fedora" ] && [ ! "$FEDORA_HAS_KEYD" = "1" ] || [ "$distro" = "deb" ] ) && [ "$build_keyd" = "1" ]; then
echo "Compiling keyd"
git clone https://github.com/rvaiya/keyd &>> pkg.log
cd keyd
make &>> pkg.log
$privesc make install
cd ..
else
echo "Installing keyd"
case $distro in
suse)
$privesc zypper --non-interactive install keyd &>> pkg.log
;;
arch)
$privesc pacman -S --noconfirm keyd &>> pkg.log
;;
alpine)
$privesc apk add --no-interactive keyd &>> pkg.log
;;
void)
$privesc xbps-install -S keyd -y &>> pkg.log
;;
fedora)
$privesc dnf4 install -y keyd &>> pkg.log
;;
esac
fi
fi
echo "Generating config"
# Handle any special cases
if (grep -E "^(Nocturne|Atlas|Eve)$" /sys/class/dmi/id/product_name &> /dev/null)
then
cp configs/cros-pixel.conf cros.conf
$privesc mkdir -p /etc/udev/hwdb.d/
$privesc cp configs/61-pixel-keyboard.hwdb /etc/udev/hwdb.d/
$privesc udevadm hwdb --update
$privesc udevadm trigger
elif (grep -E "^(Sarien|Arcada)$" /sys/class/dmi/id/product_name &> /dev/null)
then
cp configs/cros-sarien.conf cros.conf
else
printf "By default, the top row keys will do their special function (brightness, volume, browser control, etc).\n"
printf "Holding the search key will make the top row keys act like fn keys (f1, f2, f3, etc).\n"
printf "Would you like to invert this? (y/N) "
read -r INVERT
if [ "$distro" == "nixos" ] && ! which python3 &>/dev/null; then
[[ $INVERT =~ ^[Yy]$ ]] && nix-shell -p python3 --run "python3 cros-keyboard-map.py -i" ||
nix-shell -p python3 --run "python3 cros-keyboard-map.py"
else
[[ $INVERT =~ ^[Yy]$ ]] && python3 cros-keyboard-map.py -i || python3 cros-keyboard-map.py
fi
fi
echo "Installing config"
$privesc mkdir -p /etc/keyd
$privesc cp cros.conf /etc/keyd
echo "Enabling keyd"
case $distro in
alpine)
# Chimera uses apk like alpine but uses dinit instead of openrc
if [ -f /usr/bin/dinitctl ]; then
$privesc dinitctl start keyd
$privesc dinitctl enable keyd
else
$privesc rc-update add keyd
$privesc rc-service keyd restart
fi
;;
void)
if [ -f /usr/bin/sv ]; then
$privesc ln -s /etc/sv/keyd /var/service
$privesc sv enable keyd
$privesc sv start keyd
else
echo "This script can only be used for Void Linux using 'runit' init system. Other init system on Void Linux are currently unsupported."
echo "I'M OUTTA HERE!"
exit 1
fi
;;
*)
$privesc systemctl enable keyd
$privesc systemctl restart keyd
;;
esac
echo "Installing libinput configuration"
$privesc mkdir -p /etc/libinput
if [ -f /etc/libinput/local-overrides.quirks ]; then
cat $ROOT/local-overrides.quirks | $privesc tee -a /etc/libinput/local-overrides.quirks > /dev/null
else
$privesc cp $ROOT/local-overrides.quirks /etc/libinput/local-overrides.quirks
fi
echo "Done"
# reset color
printf "\033[0m"

3
cros-keyboard-map/keyd/.gitattributes vendored Normal file
View file

@ -0,0 +1,3 @@
data/* -diff
layouts/* -diff
src/unicode.c -diff

11
cros-keyboard-map/keyd/.gitignore vendored Normal file
View file

@ -0,0 +1,11 @@
*.swp
*.swn
*.swo
*.out
tags
bin/
*.o
*.gch
__pycache__
test.log
keyd.service

View file

@ -0,0 +1,7 @@
The best way to contribute is to file an issue with any bugs you find or any
features you think belong in keyd. Small issues pertaining to things like
compilation on different platforms can be submitted as PRs but please avoid
sending in patches which change core functionality without filing an issue
first. The key logic can be deceptively simple and contains a few subtleties
that need to be managed properly. Additionally, I reserve the right to reject
any features which I do not think belong in keyd.

View file

@ -0,0 +1,21 @@
MIT/X Consortium License
© 2020 Raheman Vaiya <r.vaiya@gmail.com>
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
DEALINGS IN THE SOFTWARE.

View file

@ -0,0 +1,114 @@
.PHONY: all clean install uninstall debug man compose test-harness
VERSION=2.5.0
COMMIT=$(shell git describe --no-match --always --abbrev=7 --dirty)
VKBD=uinput
PREFIX?=/usr/local
CONFIG_DIR?=/etc/keyd
SOCKET_PATH=/var/run/keyd.socket
CFLAGS:=-DVERSION=\"v$(VERSION)\ \($(COMMIT)\)\" \
-I/usr/local/include \
-L/usr/local/lib \
-Wall \
-Wextra \
-Wno-unused \
-std=c11 \
-DSOCKET_PATH=\"$(SOCKET_PATH)\" \
-DCONFIG_DIR=\"$(CONFIG_DIR)\" \
-DDATA_DIR=\"$(PREFIX)/share/keyd\" \
-D_FORTIFY_SOURCE=2 \
-D_DEFAULT_SOURCE \
-Werror=format-security \
$(CFLAGS)
platform=$(shell uname -s)
ifeq ($(platform), Linux)
COMPAT_FILES=
else
LDFLAGS+=-linotify
COMPAT_FILES=
endif
all:
-mkdir bin
cp scripts/keyd-application-mapper bin/
$(CC) $(CFLAGS) -O3 $(COMPAT_FILES) src/*.c src/vkbd/$(VKBD).c -lpthread -o bin/keyd $(LDFLAGS)
debug:
CFLAGS="-g -fsanitize=address -Wunused" $(MAKE)
compose:
-mkdir data
./scripts/generate_xcompose
man:
for f in docs/*.scdoc; do \
target=$${f%%.scdoc}.1.gz; \
target=data/$${target##*/}; \
scdoc < "$$f" | gzip > "$$target"; \
done
install:
@if [ -e /run/systemd/system ]; then \
sed -e 's#@PREFIX@#$(PREFIX)#' keyd.service.in > keyd.service; \
mkdir -p $(DESTDIR)$(PREFIX)/lib/systemd/system/; \
install -Dm644 keyd.service $(DESTDIR)$(PREFIX)/lib/systemd/system/keyd.service; \
else \
echo "NOTE: systemd not found, you will need to manually add keyd to your system's init process."; \
fi
@if [ "$(VKBD)" = "usb-gadget" ]; then \
sed -e 's#@PREFIX@#$(PREFIX)#' src/vkbd/usb-gadget.service.in > src/vkbd/usb-gadget.service; \
install -Dm644 src/vkbd/usb-gadget.service $(DESTDIR)$(PREFIX)/lib/systemd/system/keyd-usb-gadget.service; \
install -Dm755 src/vkbd/usb-gadget.sh $(DESTDIR)$(PREFIX)/bin/keyd-usb-gadget.sh; \
fi
mkdir -p $(DESTDIR)$(CONFIG_DIR)
mkdir -p $(DESTDIR)$(PREFIX)/bin/
mkdir -p $(DESTDIR)$(PREFIX)/share/keyd/
mkdir -p $(DESTDIR)$(PREFIX)/share/keyd/layouts/
mkdir -p $(DESTDIR)$(PREFIX)/share/man/man1/
mkdir -p $(DESTDIR)$(PREFIX)/share/doc/keyd/
mkdir -p $(DESTDIR)$(PREFIX)/share/doc/keyd/examples/
-groupadd keyd
install -m755 bin/* $(DESTDIR)$(PREFIX)/bin/
install -m644 docs/*.md $(DESTDIR)$(PREFIX)/share/doc/keyd/
install -m644 examples/* $(DESTDIR)$(PREFIX)/share/doc/keyd/examples/
install -m644 layouts/* $(DESTDIR)$(PREFIX)/share/keyd/layouts
cp -r data/gnome-* $(DESTDIR)$(PREFIX)/share/keyd
install -m644 data/*.1.gz $(DESTDIR)$(PREFIX)/share/man/man1/
install -m644 data/keyd.compose $(DESTDIR)$(PREFIX)/share/keyd/
uninstall:
-groupdel keyd
rm -rf $(DESTDIR)$(PREFIX)/lib/systemd/system/keyd.service \
$(DESTDIR)$(PREFIX)/bin/keyd \
$(DESTDIR)$(PREFIX)/bin/keyd-application-mapper \
$(DESTDIR)$(PREFIX)/share/doc/keyd/ \
$(DESTDIR)$(PREFIX)/share/man/man1/keyd*.gz \
$(DESTDIR)$(PREFIX)/share/keyd/ \
$(DESTDIR)$(PREFIX)/lib/systemd/system/keyd-usb-gadget.service \
$(DESTDIR)$(PREFIX)/bin/keyd-usb-gadget.sh \
$(DESTDIR)$(PREFIX)/lib/systemd/system/keyd.service
clean:
-rm -rf bin keyd.service src/vkbd/usb-gadget.service
test:
@cd t; \
for f in *.sh; do \
./$$f; \
done
test-io:
-mkdir bin
$(CC) \
-DDATA_DIR= \
-o bin/test-io \
t/test-io.c \
src/keyboard.c \
src/string.c \
src/macro.c \
src/config.c \
src/log.c \
src/ini.c \
src/keys.c \
src/unicode.c && \
./bin/test-io t/test.conf t/*.t

View file

@ -0,0 +1,338 @@
[![Kofi](https://badgen.net/badge/icon/kofi?icon=kofi&label)](https://ko-fi.com/rvaiya)
# Impetus
[![Packaging status](https://repology.org/badge/tiny-repos/keyd.svg)](https://repology.org/project/keyd/versions)
Linux lacks a good key remapping solution. In order to achieve satisfactory
results a medley of tools need to be employed (e.g xcape, xmodmap) with the end
result often being tethered to a specified environment (X11). keyd attempts to
solve this problem by providing a flexible system wide daemon which remaps keys
using kernel level input primitives (evdev, uinput).
# Note on v2
The config format has undergone several iterations since the first
release. For those migrating their configs from v1 it is best
to reread the [man page](https://raw.githubusercontent.com/rvaiya/keyd/refs/heads/master/docs/keyd.scdoc) (`man keyd`).
See also: [changelog](docs/CHANGELOG.md).
# Goals
- Speed (a hand tuned input loop written in C that takes <<1ms)
- Simplicity (a [config format](#sample-config) that is intuitive)
- Consistency (modifiers that [play nicely with layers](https://github.com/rvaiya/keyd/blob/6dc2d5c4ea76802fd192b143bdd53b1787fd6deb/docs/keyd.scdoc#L128) by default)
- Modularity (a UNIXy core extensible through the use of an [IPC](https://github.com/rvaiya/keyd/blob/90973686723522c2e44d8e90bb3508a6da625a20/docs/keyd.scdoc#L391) mechanism)
# Features
keyd has several unique features many of which are traditionally only
found in custom keyboard firmware like [QMK](https://github.com/qmk/qmk_firmware)
as well as some which are unique to keyd.
Some of the more interesting ones include:
- Layers (with support for [hybrid modifiers](https://github.com/rvaiya/keyd/blob/6dc2d5c4ea76802fd192b143bdd53b1787fd6deb/docs/keyd.scdoc#L128)).
- Key overloading (different behaviour on tap/hold).
- Keyboard specific configuration.
- Instantaneous remapping (no more flashing :)).
- A client-server model that facilitates scripting and display server agnostic application remapping. (Currently ships with support for X, sway, and gnome (wayland)).
- System wide config (works in a VT).
- First class support for modifier overloading.
- Unicode support.
### keyd is for people who:
- Would like to experiment with custom [layers](https://docs.qmk.fm/feature_layers) (i.e custom shift keys)
and oneshot modifiers.
- Want to have multiple keyboards with different layouts on the same machine.
- Want to be able to remap `C-1` without breaking modifier semantics.
- Want a keyboard config format which is easy to grok.
- Like tiny daemons that adhere to the Unix philosophy.
- Want to put the control and escape keys where God intended.
- Wish to be able to switch to a VT to debug something without breaking their keymap.
### What keyd isn't:
- A tool for programming individual key up/down events.
# Dependencies
- Your favourite C compiler
- Linux kernel headers (already present on most systems)
## Optional
- python (for application specific remapping)
- python-xlib (only for X support)
- dbus-python (only for KDE support)
# Installation
*Note:* master serves as the development branch, things may occasionally break
between releases. Releases are [tagged](https://github.com/rvaiya/keyd/tags), and should be considered stable.
## From Source
git clone https://github.com/rvaiya/keyd
cd keyd
make && sudo make install
sudo systemctl enable --now keyd
# Quickstart
1. Install and start keyd (e.g `sudo systemctl enable keyd --now`)
2. Put the following in `/etc/keyd/default.conf`:
```
[ids]
*
[main]
# Maps capslock to escape when pressed and control when held.
capslock = overload(control, esc)
# Remaps the escape key to capslock
esc = capslock
```
Key names can be obtained by using the `keyd monitor` command. Note that while keyd is running, the output of this
command will correspond to keyd's output. The original input events can be seen by first stopping keyd and then
running the command. See the man page for more details.
3. Run `sudo keyd reload` to reload the config set.
4. See the man page (`man keyd`) for a more comprehensive description.
Config errors will appear in the log output and can be accessed in the usual
way using your system's service manager (e.g `sudo journalctl -eu keyd`).
*Note*: It is possible to render your machine unusable with a bad config file.
Should you find yourself in this position, the special key sequence
`backspace+escape+enter` should cause keyd to terminate.
Some mice (e.g the Logitech MX Master) are capable of emitting keys and
are consequently matched by the wildcard id. It may be necessary to
explicitly blacklist these.
## Application Specific Remapping (experimental)
- Add yourself to the keyd group:
`usermod -aG keyd <user>`
- Populate `~/.config/keyd/app.conf`:
E.G
[alacritty]
alt.] = macro(C-g n)
alt.[ = macro(C-g p)
[chromium]
alt.[ = C-S-tab
alt.] = macro(C-tab)
- Run:
`keyd-application-mapper`
You will probably want to put `keyd-application-mapper -d` somewhere in your
display server initialization logic (e.g ~/.xinitrc) unless you are running Gnome.
See the man page for more details.
## SBC support
Experimental support for single board computers (SBCs) via usb-gadget
has been added courtesy of Giorgi Chavchanidze.
See [usb-gadget.md](src/vkbd/usb-gadget.md) for details.
## Packages
Third party packages for the some distributions also exist. If you wish to add
yours to the list please file a PR. These are kindly maintained by community
members, no personal responsibility is taken for them.
### Alpine Linux
[keyd](https://pkgs.alpinelinux.org/packages?name=keyd) package maintained by [@jirutka](https://github.com/jirutka).
### Arch
[Arch Linux](https://archlinux.org/packages/extra/x86_64/keyd/) package maintained by Arch packagers.
### Debian
Experimental `keyd` and `keyd-application-mapper` packages can be found in the
CI build artifacts of the [work-in-progress Debian package
repository](https://salsa.debian.org/rhansen/keyd):
* [amd64 (64-bit)](https://salsa.debian.org/rhansen/keyd/-/jobs/artifacts/debian/latest/browse/debian/output?job=build)
* [i386 (32-bit)](https://salsa.debian.org/rhansen/keyd/-/jobs/artifacts/debian/latest/browse/debian/output?job=build%20i386)
Any Debian Developer who is willing to review the debianization effort and
sponsor its upload is encouraged to contact
[@rhansen](https://github.com/rhansen) (also see the [Debian ITP
bug](https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1060023)).
### Fedora
[COPR](https://copr.fedorainfracloud.org/coprs/alternateved/keyd/) package maintained by [@alternateved](https://github.com/alternateved).
### Gentoo
[GURU](https://gitweb.gentoo.org/repo/proj/guru.git/tree/app-misc/keyd) package maintained by [jack@pngu.org](mailto:jack@pngu.org).
### openSUSE
[opensuse](https://software.opensuse.org//download.html?project=hardware&package=keyd) package maintained by [@bubbleguuum](https://github.com/bubbleguuum).
Easy install with `sudo zypper in keyd`.
### Ubuntu
Experimental `keyd` and `keyd-application-mapper` packages can be found in the
[`ppa:keyd-team/ppa`
archive](https://launchpad.net/~keyd-team/+archive/ubuntu/ppa).
If you wish to help maintain this PPA, please contact
[@rhansen](https://github.com/rhansen).
### Void Linux
[xbps](https://github.com/void-linux/void-packages/tree/master/srcpkgs/keyd) package maintained by [@Barbaross](https://gitlab.com/Barbaross).
Easy install with `sudo xbps-install -Su keyd`.
# Example 1
[ids]
*
[main]
leftshift = oneshot(shift)
capslock = overload(symbols, esc)
[symbols]
d = ~
f = /
...
# Example 2
This overrides specific alt combinations macOS users might
be more familiar with, while keeping the rest intact.
[ids]
*
[alt]
x = C-x
c = C-c
v = C-v
a = C-a
f = C-f
r = C-r
z = C-z
# Recommended config
Many users will probably not be interested in taking full advantage of keyd.
For those who seek simple quality of life improvements I can recommend the
following config:
[ids]
*
[main]
shift = oneshot(shift)
meta = oneshot(meta)
control = oneshot(control)
leftalt = oneshot(alt)
rightalt = oneshot(altgr)
capslock = overload(control, esc)
insert = S-insert
This overloads the capslock key to function as both escape (when tapped) and
control (when held) and remaps all modifiers to 'oneshot' keys. Thus to produce
the letter A you can now simply tap shift and then a instead of having to hold
it. Finally it remaps insert to S-insert (paste on X11).
# FAQS
## Why is my trackpad is interfering with input after enabling keyd?
libinput, a higher level input component used by most wayland and X11 setups,
includes a feature called 'disable-while-typing' that disables the trackpad
when typing.
In order to achieve this, it needs to distinguish between internal and external
keyboards, which it does by hard coding a rules for specific hardware
('quirks'). Since keyd creates a virtual device which subsumes both external
and integrated keyboards, you will need to instruct libinput to regard the keyd
virtual device as internal.
This can be achieved by adding the following to `/etc/libinput/local-overrides.quirks` (which may need to be created):
```
[Serial Keyboards]
MatchUdevType=keyboard
MatchName=keyd*keyboard
AttrKeyboardIntegration=internal
```
Credit to @mark-herbert42 and @canadaduane for the original solution.
## What about xmodmap/setxkbmap/*?
xmodmap and friends are display server level tools with limited functionality.
keyd is a system level solution which implements advanced features like
layering and [oneshot](https://docs.qmk.fm/#/one_shot_keys)
modifiers. While some X tools offer similar functionality I am not aware of
anything that is as flexible as keyd.
## What about [kmonad](https://github.com/kmonad/kmonad)?
keyd was written several years ago to allow me to easily experiment with
different layouts on my growing keyboard collection. At the time kmonad did not
exist and custom keyboard firmware like
[QMK](https://github.com/qmk/qmk_firmware) (which inspired keyd) was the only
way to get comparable features. I became aware of kmonad after having published
keyd. While kmonad is a fine project with similar goals, it takes a different
approach and has a different design philosophy.
Notably keyd was written entirely in C with performance and simplicitly in
mind and will likely never be as configurable as kmonad (which is extensible
in Haskell). Having said that, it supplies (in the author's opinion) the
most valuable features in less than 2000 lines of C while providing
a simple language agnostic config format.
## Why doesn't keyd implement feature X?
If you feel something is missing or find a bug you are welcome to file an issue
on github. keyd has a minimalist (but sane) design philosophy which
intentionally omits certain features (e.g execing arbitrary executables
as root). Things which already exist in custom keyboard firmware like QMK are
good candidates for inclusion.
# Contributing
See [CONTRIBUTING](CONTRIBUTING.md).
IRC Channel: #keyd on oftc

View file

@ -0,0 +1,8 @@
streamline test logic
organize tests
cleanup manpage
[idea] tmux like layer timeouts
improved mouse support (integrate moused?)
multi-user support (remove keyd group)
split up the man page + add FAQ
add descriptor state + isolate descriptor logic

View file

@ -0,0 +1,65 @@
import * as Main from 'resource:///org/gnome/shell/ui/main.js';
import GLib from 'gi://GLib';
import Shell from 'gi://Shell';
import Gio from 'gi://Gio';
import { Extension } from 'resource:///org/gnome/shell/extensions/extension.js';
let file = Gio.File.new_for_path(makePipe());
let pipe = file.append_to_async(0, 0, null, on_pipe_open);
function makePipe() {
let runtime_dir = GLib.getenv('XDG_RUNTIME_DIR');
if (!runtime_dir)
runtime_dir = '/run/user/'+new TextDecoder().decode(
GLib.spawn_command_line_sync('id -u')[1]
).trim();
let path = runtime_dir + '/keyd.fifo';
GLib.spawn_command_line_sync('mkfifo ' + path);
return path;
}
function send(msg) {
if (!pipe)
return;
try {
pipe.write(msg, null);
} catch {
log('pipe closed, reopening...');
pipe = null;
file.append_to_async(0, 0, null, on_pipe_open);
}
}
function on_pipe_open(file, res) {
log('pipe opened');
pipe = file.append_to_finish(res);
}
export default class KeydExtension extends Extension {
enable() {
Shell.WindowTracker.get_default().connect('notify::focus-app', () => {
const win = global.display.focus_window;
const cls = win ? win.get_wm_class() : 'root';
const title = win ? win.get_title() : '';
send(`${cls} ${title}\n`);
});
Main.layoutManager.connectObject(
'system-modal-opened', () => {
send(`system-modal ${global.stage.get_title()}\n`);
},
this
);
GLib.spawn_command_line_async('keyd-application-mapper -d');
}
disable() {
GLib.spawn_command_line_async('pkill -f keyd-application-mapper');
}
}

View file

@ -0,0 +1,7 @@
{
"name": "keyd",
"description": "Used by keyd to obtain active window information.",
"uuid": "keyd",
"shell-version": [ "45", "46", "47", "48" ]
}

View file

@ -0,0 +1,65 @@
const Shell = imports.gi.Shell;
const GLib = imports.gi.GLib;
const Gio = imports.gi.Gio;
const Main = imports.ui.main;
let file = Gio.File.new_for_path(makePipe());
let pipe = file.append_to_async(0, 0, null, on_pipe_open);
function makePipe() {
let runtime_dir = GLib.getenv('XDG_RUNTIME_DIR');
if (!runtime_dir)
runtime_dir = '/run/user/'+new TextDecoder().decode(
GLib.spawn_command_line_sync('id -u')[1]
).trim();
let path = runtime_dir + '/keyd.fifo';
GLib.spawn_command_line_sync('mkfifo ' + path);
return path;
}
function send(msg) {
if (!pipe)
return;
try {
pipe.write(msg, null);
} catch {
log('pipe closed, reopening...');
pipe = null;
file.append_to_async(0, 0, null, on_pipe_open);
}
}
function on_pipe_open(file, res) {
log('pipe opened');
pipe = file.append_to_finish(res);
}
function init() {
return {
enable: function() {
Shell.WindowTracker.get_default().connect('notify::focus-app', () => {
const win = global.display.focus_window;
const cls = win ? win.get_wm_class() : 'root';
const title = win ? win.get_title() : '';
send(`${cls} ${title}\n`);
});
Main.layoutManager.connectObject(
'system-modal-opened', () => {
send(`system-modal ${global.stage.get_title()}\n`);
},
this
);
GLib.spawn_command_line_async('keyd-application-mapper -d');
},
disable: function() {
GLib.spawn_command_line_async('pkill -f keyd-application-mapper');
}
}
}

View file

@ -0,0 +1,7 @@
{
"name": "keyd",
"description": "Used by keyd to obtain active window information.",
"uuid": "keyd",
"shell-version": [ "42", "43", "44" ]
}

Binary file not shown.

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,242 @@
# v2.5.0
- Allow 64 character layer names
- Introduce a new device id format to distinguish between devices with identical product/vendor id pairs (backward compatible)
- Add KDE/plasma5 support to `keyd-application-mapper`
- Gnome v45/v46 application remapping support
- Increases the maximum number of descriptors to allow for more advanced configs
- Add `setlayout()` to facilitate dynamically set layouts
- `toggle()` now activates the layer on key down instead of key up
- Improve support for exotic keys
- Various minor bug fixes
# v2.4.3
## Summary (non exhaustive)
- Introduces a new layout type
- Improves application based remapping suport for wayland/X
- Adds `swap` support for toggled layers
- Adds support for chording
- Numerous bugfixes and stability improvements
## New Actions:
- togglem (#270)
- clear() (#253)
- overloadt (#309)
- overloadt2
## New Commands:
- listen command (#294, #217)
- reload
- do
- input
## New timeout and modifier knobs:
- disable_modifier_guard (#257)
- oneshot_timeout option
- overload_tap_timeout
- macro_sequence_timeout (#255)
See the manpage for details.
# v2.4.2
- Add include directive to the config syntax
- Ship includable common layouts
- Allow comments in the ids section (#245)
- Create virtual pointer on initialization (#249)
- Misc bug fixes
# v2.4.1
- Route button presses through the virtual keyboard (#162)
- Improve mouse support
- Fix VT repeat bug
- Allow overload to accept an arbitrary action (#199)
- Add support for full key serquences to swap()
- Misc bugfixes
# v2.4.0
- Fix macro timeouts
- Allow timeouts to be used in conjunction with + (#181)
- Add macro2() to allow for per-macro timeout values (#176)
- Add command() to allow for command execution
- Add [global] section
- Improve unicode support
- Add support for older kernels (#163)
- Clear oneshot on click
- Various bugfixes and enhancements
# v2.3.1-rc
- Add unicode support
- Add noop
- Fix keyd-application-mapper hotswapping
# v2.3.0-rc
This is a **major release** which breaks **backward compatibility** with
non trivial configs. It is best to reread the man page. Minimal
breaking changes are expected moving forward.
- Introduce composite layers
- Add timeout()
- Simplify layer model
- Layer entries are now affected by active modifiers (current layer modifiers excepted)
- Eliminate layer types
- Eliminate -d
See [DESIGN.md](DESIGN.md) for a more thorough description of changes.
# v2.2.7-beta
- Fix support for symlinked config files (#148)
- Improve out of the box handling of alt and meta overloading (#128)
- Add unicode support to keyd-application-mapper
- Various bugfixes and stability improvements
# v2.2.5-beta
- Eliminate udev as a dependency
- Permit mapping to modifier key codes (still discouraged)
- Support for nested swapping
- Improve app detection
- Various bug fixes
# v2.2.4-beta
- Add support for application mapping by title
- Fix macro timeouts
- Forbid modifier keycodes as lone right hand values in favour of layers
# v2.2.3-beta
- Enable hot swapping of depressed keybindings via -e
- Improve support for application remapping
# v2.2.2-beta
- Change panic sequence to `backspace+enter+escape` (#94)
- Fix overload+modifer behaviour (#95)
# v2.2.1-beta
- Move application bindings into ~/.config/keyd/app.conf.
- Add -d to keyd-application-mapper.
- Fix broken gnome support.
# v2.2.0-beta
- Add a new IPC mechanism for dynamically altering the keymap (-e).
- Add experimental support for app specific bindings.
# v2.1.0-beta
NOTE: This might break some configs (see below)
- Change default modifier mappings to their full names (i.e `control =
layer(control)` instead of `control = layer(C)` in an unmodified key map)`.
- Modifier names are now syntactic sugar for assigning both associated key
codes. E.G `control` corresponds to both `leftcontrol` and `rightcontrol`
when assigned instead of just the former. (Note: this also means it is no
longer a valid right hand value)
- Fixes v1 overload regression (#74)
# v2.0.1-beta
- Add + syntax to macros to allow for simultaenously held keys.
# v2.0.0-beta
Major version update.
This breaks 1.x configs. The format may ~~change slightly~~ (see [2.3.0-rc](#v230-rc)) before leaving beta,
but once it does should remain backwards compatible for the foreseeable future.
A non exhaustive list of changes can be found below. It is best to forget
everything you know and read man page anew.
- Eliminate layer inheritance in favour of simple types.
(layouts are now defined with `:layout` instead of `:main`)
- Macros are now repeatable.
- Overload now accepts a hold threshold timeout.
- Config files are now vendor/product id oriented.
- SIGUSR1 now triggers a config reload.
- Modifiers are layers by default and can be extended directly.
- Config files now end in `.conf`.
- `layert()` is now `toggle()`.
- All layers are 'modifier layers' (terminological change)
- Eliminate the dedicated modifer layout.
- Modifiers no longer apply to key sequences defined within a layer.
(Layer entries are now always executed verbatim.)
The old behaviour was unintuitive and can be emulated using nested
layers if necessary.
For most old configs transitioning should be a simple matter of changing
the file extension from `.cfg` to `.conf`, replacing `layert` with
`toggle`, changing `:main` to `:layout` and adding
```
[ids]
*
[main]
```
to the top of the file.
More involved configs may need additional changes, but should be possible
to replicate using the new rules. If not, please file an issue on
[github](https://github.com/rvaiya/keyd/issues).
# v1.1.1
- Make layert behaviour more intuitive when combined with oneshot() and layer().
# v1.1.0
- Add layert() to facilitate semipermanent-activation of occluding layers.
- Resolve layer conflicts by picking the one which was most recently activated.
# v1.0.0
Major version update:
- Introduce support for modifier layers.
- Simplify the config format.
- Improve consistency/expected key behaviour.
- Symbols can now be assigned directly place of their names (e.g `&` instead of `S-7`).
- Macro support.
*This breaks existing configs*. Moving forward the config format is expected to
remain backwards compatible.
Main Config Changes:
- Modifiers are now just treated as layers
- The default layer is now called main
- The modifier layout is distinct from the key layout
Config migration map:
```
mods_on_hold(C, esc) = overload(C, esc)
layer_on_hold(layer, esc) = overload(layer, esc)
layer_toggle(layer) = layout(layer)
layer(layer) = layer(layer)
oneshot(mods) = oneshot(mods)
oneshot_layer(layer) = oneshot(layer)
[dvorak:default] = [dvorak:main]
```
See the [manpage](man.md) for details.

View file

@ -0,0 +1,122 @@
This document contains a description of major design iterations.
It is not intended to be exhaustive.
# v2.3.0-rc
This is a major release which breaks backward compatibility for
non-trivial configs (we are still in beta after all :P).
In the absence of too much blowback, this will probably become the final
v2 design.
Much of this harkens back to v1, with some additional simplifications
and enhancements.
## Notable changes:
- Introduced composite layers
- Eliminated sequences in favour of macros (C-x is now just syntactic
sugar for macro(C-x)).
- Actions which previously accepted sequences as a second argument
now accept macros of any kind.
- General stability/speed/memory improvements
- Made the man page less war and peacey
## Non backward-compatible changes
- Replaced three arg overload() with a more flexible timeout() mechanism
- Layers are now fully transparent. That is, bindings are drawn on the basis
of activation order with [main] being active by default.
- Modifiers now apply to all bindings with the exception of modifiers
associated with the active layer.
Rationale:
The end result is more intuitive and in conjunction with transparency
allows modifiers to be paired with layer entries without having
to use layer nesting (#103).
E.G
```
capslock = layer(nav)
[nav:C]
h = left
l = right
```
will cause `capslock+h` to produce `left` (rather than `C-left`), while
`control+capslock+h` will produce `C-left`, as one might intuit.
- Abolished layer types. Notably, the concept of a 'layout' no longer exists.
Rationale:
This simplifies the lookup logic, elminates the need for dedicated layout
actions, and makes it easier to define common bindings for letter layouts
since the main layer can be used as a fallback during lookup.
E.G
[main]
capslock = layer(capslock)
[dvorak]
a = a
s = o
...
[capslock]
1 = toggle(dvorak)
- Special characters within macros like ) and \ must be escaped with a backslash.
- Modifier sequences (e.g `C-M`) are no longer valid layers by default.
Rationale:
This was legacy magic from v1 which added a bunch of cruft to the code and
seemed to cause confusion by blurring the boundaries between layers and
modifiers. Similar results can be achieved by explicitly defining an
empty layer with the desired modifier tags:
I.E
a = layer(M-C)
b = layer(M)
becomes
a = layer(meta-control)
b = layer(meta)
[meta-control:M-C]
Note that in the above sample "meta" does not need to be
explicitly defined, since full modifier names are still
mapped to their eponymously named layers.
- Eliminated -d
Rationale:
Modern init systems are quite adept at daemonization, and the end user
can always redirect/fork using a wrapper script if desired.
- Eliminated reload on SIGUSR1
Rationale:
Startup time has been reduced making the cost of a full
restart negligible (and probably more reliable).

View file

@ -0,0 +1,113 @@
keyd-application-mapper(1)
# NAME
keyd-application-mapper - remap keys when window focus changes
# SYNOPSIS
*keyd-application-mapper* [*-d*|*--daemonize*] [*-v*|*--verbose*]
# OPTIONS
*-v, --verbose*
Write verbose output. This includes printing the window focus events detected.
You can use this output to determine what a window's class and title is for the
purpose of setting mappings for that window in the config file.
*-d, --daemonize*
Daemonize, write output to _~/.config/keyd/app.log_ instead of stdout.
# DESCRIPTION
A script which reads _~/.config/keyd/app.conf_ and applies the supplied
bindings whenever a window with a matching class comes into focus.
You can think of each section as a set of application specific masks applied
over the global rules defined in _/etc/keyd/\*.conf_.
The config file has the following form:
```
[<filter>]
<expression 1>
<expression 2>
...
```
Where _<filter>_ has one of the following forms:
```
\[<class exp>\] # Match by window class
\[<class exp>|<title exp>\] # Match by class and title
```
and each _<expression>_ is a valid argument to _keyd bind_ (see *Bindings*).
_<class exp>_ and _<title exp>_ are strings which describe window class and title names
to be matched, and may optionally contain unix style wildcards (\*). For example,
_[gnome|\*find\*]_ will match any window with a class of _gnome_ and a title
containing the substring _find_.
E.G:
```
[kitty]
alt.] = C-tab
alt.[ = C-S-tab
alt.t = C-S-t
[st-*]
alt.1 = macro(Inside space st)
[chromium]
control.1 = macro(Inside space chrome!)
alt.] = C-tab
alt.[ = C-S-tab
alt.t = C-t
```
Will remap _A-1_ to the the string 'Inside st' when a window with a class
that begins with 'st-' (e.g st-256color) is active.
Window class and title names can be obtained by inspecting the output if the program
was started with the _-v, --verbose_ option. If the program was daemonized, you can
read the log file output by e.g. _tail\ -f\ ~/.config/keyd/app.log_.
A reload may be triggered by sending the script a USR1 signal.
At the moment X, Sway and Gnome are supported.
# INSTALLATION
Installation is a simple matter of running the command _keyd-application-mapper -d_
somewhere in your display server initialization logic (e.g _~/.xinitrc_ or
_~/.xsession_). If you are running Gnome,
running _keyd-application-mapper_ for the first time will install an extension
which manages the script lifecycle.
In order for this to work, keyd must be running and the user must have access
to */var/run/keyd.socket* (i.e be a member of the *keyd* group).
# ENVIRONMENT VARIABLES
*KEYD_DEBUG*
Debug log level. _0_,_1_ can be specified (default: 0).
# A note on security
*Any user which can interact with a program that directly controls input devices
should be assumed to have full access to the system.*
While keyd offers slightly better isolation compared to other remappers by dint
of mediating access through an IPC mechanism (rather than granting users
blanket access to /dev/input/\* and /dev/uinput), it still provides an
opportunity for abuse and should be treated with due deference.
Specifically, access to */var/run/keyd.socket* should only be granted to
trusted users and the group _keyd_ should be regarded with the same reverence
as _wheel_.

View file

@ -0,0 +1,994 @@
keyd(1)
# NAME
*keyd* - A key remapping daemon.
# SYNOPSIS
*keyd* [command] [options]
# COMMANDS
*monitor [-t]*
Print key events. If -t is supplied, also prints time since the last event in ms. Useful for discovering key names/device ids and debugging.
*listen*
Print layer state changes of the running keyd daemon to stdout. Useful for scripting.
*bind reset|<binding> [<binding>...]*
Apply the supplied bindings. See _Bindings_ for details.
*reload*
Reload config files.
*list-keys*
List valid key names.
*input [-t <timeout>] <text> [<text>...]*
Input the supplied text. If no arguments are given, read the input from STDIN.
A timeout in microseconds may optionally be supplied corresponding to the time
between emitted events.
*do [-t <timeout>] [<exp>]*
Execute the supplied expression. See MACROS for the format of <exp>. If no arguments are given, the expression is read from STDIN. If supplied, <timeout> corresponds to the macro_sequence_timeout.
*check [<config file>...]*
Validate the supplied config files. If no files are supplied, all files in the config directory are checked.
This exits with a non-zero return code if and only if any files fail validation.
# OPTIONS
*-v, --version*
Print the current version and exit.
*-h, --help*
Print help and exit.
# DESCRIPTION
keyd is a system wide key remapping daemon which supports features like
layering, oneshot modifiers, and macros. In its most basic form it can be used
to define a custom key layout that persists across display server boundaries
(e.g wayland/X/tty).
The program runs in the foreground, printing diagnostic information to the
standard output streams, and is intended to be run as a single instance managed
by the init system.
*NOTE:*
Because keyd modifies your primary input device, it is possible to render your
machine unusable with a bad config file. If you find yourself in this situation
the panic sequence *<backspace>+<escape>+<enter>* will force keyd to
terminate.
# CONFIGURATION
Configuration files loosely follow an INI style format consisting of headers of
the form _[section_name]_ followed by a set of _bindings_. Lines beginning
with a hash are ignored.
Config files are stored in _/etc/keyd/_ and loaded upon initialization.
The reload command can be used to update the working set of config
files (e.g sudo keyd reload).
A valid config file has the extension _.conf_ and *must* begin with an _[ids]_
section that has one of the following forms:
```
[ids]
<id 1 (obtained via keyd monitor)>
<id 2>
...
```
or
```
[ids]
*
-<id 1>
-<id 2>
...
```
The first form specifies a list of ids to be explicitly matched, while the
second matches any id which has not been explicitly excluded.
For example:
```
[ids]
*
-0123:4567
```
Will match all keyboards which *do not*(2) have the id _0123:4567_, while:
```
[ids]
0123:4567
```
will exclusively match any devices which do. Device ids can be obtained from
the monitor command (see _COMMANDS_). Note that a device id may only be
listed in a single config file.
Each subsequent section of the file corresponds to a _layer_ (with the exception
of _[global]_ (see _GLOBALS_).
Config errors will appear in the log output and can be accessed in the usual
way using your system's service manager (e.g sudo journalctl -eu keyd).
If an id matches more than one device type, the prefix k: may
be used to exclusively match keyboards and the prefix m: may be used to
exclusively match mice. (E.g m:046d:b01d)
Note: All keyboards defined within a given config file will share the
same state. This is useful for linking separate input devices together
(e.g foot pedals).
Note 2: The wildcard will only match devices which keyd identifies as keyboards.
keyd is also capable of *managing mice* (e.g to facilitate clearing
of oneshot modifiers on click), but their ids must be explicitly listed.
Note 3: *Mouse support is currently experimental*, and is mostly confined to
traditional mice (e.g touchpads). Adding some mice to
your ids section may break your pointer. *It may also be necessary
to explicitly blacklist mice which are misidentified as keyboards
(e.g if you find your moused misbehaving).*
## Layers
A layer is a collection of _bindings_, each of which specifies the behaviour of
a particular key. Multiple layers may be active at any given time, forming a
stack of occluding keymaps consulted in activation order. The default layer is
called _main_ and is where common bindings should be defined.
For example, the following config snippet defines a layer called _nav_
and creates a toggle for it in the _main_ layer:
```
[main]
capslock = layer(nav)
[nav]
h = left
k = up
j = down
l = right
```
When capslock is held, the _nav_ layer occludes the _main_ layer
causing _hjkl_ to function as the corresponding arrow keys.
Unlike most other remapping tools, keyd provides first class support for
modifiers. A layer name may optionally end with a ':' followed by a
set of modifiers to emulate in the absence of an explicit mapping.
*Layer names may consist of a maximum of 64 characters* (including
all modifiers).
These layers play nicely with other modifiers and preserve existing stacking
semantics.
For example:
```
[main]
capslock = layer(capslock)
[capslock:C]
j = down
```
will cause _capslock_ to behave as _control_, except in the case of _capslock+j_, which will
emit _down_. This makes it trivial to define custom modifiers which don't interfere with
one another.
Note that bindings are not affected by the modifiers of the layer in which they
are defined. Thus *capslock+j* will produce an unmodified *down* keypress, while
*shift+capslock+j* will produce *shift+down* as expected.
Formally, each layer heading has the following form:
```
"[" <layer name>[:<modifier set>] "]"
```
Where _<modifier_set>_ has the form:
_<modifier1>[-<modifier2>]..._
and each modifier is one of:
*C* - Control++
*M* - Meta/Super++
*A* - Alt++
*S* - Shift++
*G* - AltGr
Finally, each layer heading is followed by a set of bindings which take the form:
<key> | <alias> = <key>|<macro>|<action>
for a description of <action> and <macro> see _ACTIONS_ and _MACROS_.
By default, each key is bound to itself within the main layer. The exception to this
are the modifier keys, which are instead bound to eponymously named layers with the
corresponding modifiers.
For example, _meta_ is actually bound to _layer(meta)_, where _meta_ is
internally defined as _meta:M_.
The full set of modifier bindings are as follows:
```
control = layer(control)
meta = layer(meta)
shift = layer(shift)
leftalt = layer(alt)
rightalt = layer(altgr)
```
A consequence of this is that overriding modifier keys is a simple matter of
adding the desired bindings to an appropriate pre-defined layer.
Thus
```
[ids]
*
[control]
j = down
```
is a completely valid config, which does what the benighted user might expect. Internally,
the full config actually looks something like this:
```
[ids]
*
[main]
leftcontrol = layer(control)
rightcontrol = layer(control)
[control:C]
j = down
```
If multiple bindings for the same key are present, the most recent one takes precedence.
A layer heading may also appear multiple times, in which case the layer will
contain the sum of all bindings. Note that the layer type may not be reassigned.
That is:
```
[mylayer:A]
a = b
c = d
[mylayer:C]
a = x
b = c
```
is equivalent to:
```
[mylayer:A]
a = x
b = c
c = d
```
## Composite Layers
A special kind of layer called a *composite layer* can be defined by creating a
layer with a name consisting of existing layers delimited by _+_. The resultant
layer will be activated and given precedence when all of its constituents are
activated. Composite layers are not allowed to have modifiers attached and
cannot be explicitly assigned.
E.g.
```
[control+alt]
h = left
```
will cause the sequence _control+alt+h_ to produce _left_ (ignoring the control
and alt modifiers attached to the active control and alt layers), while pressing
_control+alt+f1_ preserves those modifiers, emitting exactly what was pressed,
as there is no explicit binding for _f1_ on the composite layer.
```
[main]
capslock = layer(capslock)
[capslock:C]
[capslock+shift]
h = left
```
Will cause the sequence _capslock+shift+h_ to produce _left_, while preserving the expected functionality of _capslock_ and _shift_ in isolation.
*Note:* composite layers *must* always be defined _after_ the layers of which they
are comprised.
That is:
```
[layer1]
[layer2]
[layer1+layer2]
```
and not
```
[layer1+layer2]
[layer1]
[layer2]
```
## Layouts
A layout is a special kind of layer intended for modifying alpha keys. Unlike
layers, layouts cannot have any associated modifiers, and only one layout may
be active at a given time. The default layout is called 'main', and can be
changed using the _setlayout()_ action.
For convenience, keyd ships with a number of common letter layouts in
/usr/share/keyd/layouts. Before including these, it is instructive to inspect them.
Non-english layouts include a dedicated shift layer (making order of inclusion
important) and *require the use of keyd's compose definitions* (see *Unicode
Support*)
E.g.
```
# Include the shipped colemak layout.
include layouts/colemak
[global]
default_layout = mylayout
[mylayout:layout]
a = b
b = c
#etc...
[control]
1 = setlayout(customlayout)
2 = setlayout(colemak)
```
## Chording
_Chords_ are groups of keys which are treated as a unit when simultaneously
depressed. A chord can be defined by using a group of + delimited key names as
a left hand value. The corresponding action will be activated if all keys are
struck within the chording interval (_chord_timeout_).
E.g
```
j+k = esc
```
will cause _esc_ to be produced if both _j_ and _k_ are simultaneously depressed.
Note: It may be desirable to change the default chording interval (50ms) to
account for the physical characteristics of your keyboard.
## Unicode Support
If keyd encounters a valid UTF8 sequence as a right hand value, it will try and
translate that sequence into a macro which emits a keyd-specific XKB sequence.
In order for this to work, the sequences defined in the compose file shipped
with keyd (_/usr/share/keyd/keyd.compose_) must be accessible. This can be achieved
globally by copying the file to the appropriate location in
_/usr/share/X11/locale_, or on a per-user basis by symlinking it to
~/.XCompose.
E.g.
ln -s /usr/share/keyd/keyd.compose ~/.XCompose
**Additionally you will need to be using the default US layout on your
display server.** Users of non-english layouts are advised to set their layout
within keyd (see **Layouts**) to avoid conflicts between the display server
layout and keyd's unicode functionality.
**Note:** You may have to restart your applications for this to take effect.
**Note 2:** The generated compose sequences are affected by modifiers in the
normal way. If you want shift to produce a different symbol, you will need to
define a custom shift layer (see the included layout files for an example).
**Note 3:**
GTK4 currently has a bug which causes it to crash in the presence of large XCompose files
(like /usr/share/keyd/keyd.compose).
## Aliases
Each key may optionally be assigned an *alias*. This alias may be used in place
of the key as a valid left hand value. Multiple keys may be bound to the same alias,
but only one alias may be assigned to a key at a given time.
For example, the keys 'leftmeta' and 'rightmeta' are bound to the alias *meta*
by default. Thus the binding 'meta = a' is equivalent to the bindings 'leftmeta
= a' and 'rightmeta = a'.
Aliases are defined in a special section called 'aliases' where each line takes
the form:
<key> = <name>
where _<key>_ must be a valid key name.
Note that <name> may itself be a valid key name, in which case all references
to the key within the config file will be replaced with the new key.
Additionally, if the assigned alias is a valid key name, the corresponding
keycode will be assigned to the key by default. This makes it possible to
redefine keys before any bindings are applied and is particularly useful in
conjunction with the include mechanism to account for variations in hardware.
For example:
```
/etc/keyd/common:
meta = oneshot(meta)
alt = oneshot(alt)
a = a
s = o
# etc..
/etc/keyd/default.conf:
[ids]
*
[main]
include common
/etc/keyd/magic_keyboard.conf:
[ids]
004c:0267
[aliases]
leftalt = meta
rightalt = meta
rightmeta = alt
leftmeta = alt
[main]
include common
```
Allows the user to define a set of universal bindings in /etc/keyd/common
without having to explicitly account for the transposed meta and alt keys within
the included config snippet.
## File Inclusion
Config files may include other files located within the config directory using
the _include_ keyword. A line of the form *include <file>* may appear at any
point after the [ids] section. The resultant config will behave as though the
contents of the included file appear in place of the include statement.
Making strategic use of these statements makes it possible to share common
functionality between configs.
Include paths are relative and must be placed in one of the following
directories:
- /etc/keyd/
- /usr/share/keyd/
E.g.
```
/etc/keyd/default.conf:
[ids]
*
# Add our shared custom bindings.
include common
# Appends bindings to the main layer
# defined in /etc/keyd/common (order matters)
[main]
capslock = layer(capslock)
[capslock]
1 = setlayout(colemak)
2 = setlayout(dvorak)
/etc/keyd/common:
[main]
rightmeta = layer(nav)
[nav]
h = left
j = down
k = up
l = right
/usr/share/keyd/layouts/dvorak:
a = a
s = o
...
```
Limitations:
- All include statements should appear after the [ids] section in the including file.
- Included files should not contain an ids section.
- Included files should not include other files (inclusion is non-recursive).
- Included files should not end in .conf.
# GLOBALS
A special section called _[global]_ may be defined in the file and can contain
any of the following options:
*macro_timeout:* The time (in milliseconds) separating the initial execution of a macro
sequence and the first repetition.
(default: 600)
*macro_repeat_timeout:* The time separating successive executions of a macro.
(default: 50)
*layer_indicator:* If set, this will turn the capslock light on whenever a layer is active.
Note: Some wayland compositors will aggressively toggle LED state rendering this option
unusable.
(default: 0)
*macro_sequence_timeout:* If set, this will add a timeout (*in
microseconds*) between each emitted key in a macro sequence. This is
useful to avoid overflowing the input buffer on some systems.
*chord_timeout:* The maximum time between successive keys
interpreted as part of a chord.
(default: 50)
*chord_hold_timeout:* The length of time a chord
must be held before being activated.
(default: 0)
*oneshot_timeout:* If non-zero, timeout a oneshot layer
activation after the supplied number of milliseconds.
(default: 0)
*disable_modifier_guard:* By default, keyd will inject additional
control keypresses where necessary in order to prevent programs from
seeing additional modifier taps (E.g alt in firefox). If set, this
option disables that behaviour.
(default: 0)
*overload_tap_timeout:* If non-zero, ignore the tap behaviour of an
overloaded key if it is held for the given number of miliseconds.
(default: 0).
*Note:* Unicode characters and key sequences are treated as macros, and
are consequently affected by the corresponding timeout options.
# MACROS
Various keyd actions accept macro expressions.
A macro expression has one of the following forms:
. macro(<exp>)
. [<modifier 1>[-<modifier 2>...]-<key>
. <char>
Where _<char>_ is a valid unicode character and _<exp>_ has the form _<token1> [<token2>...]_ and each token is one of:
- A valid key code.
- A type 2 macro.
- A contiguous group of unicode characters.
- A group of key codes delimited by + to be depressed as a unit.
- A timeout of the form _<time>ms_ (where _<time>_ < 1024).
The following are all valid macro expressions:
- C-a
- macro(C-a)
- macro(leftcontrol+leftmeta) # simultaneously taps the left meta and left control keys
- A-M-x
- macro(Hello space World)
- macro(h e l l o space w o r ld) (identical to the above)
- macro(C-t 100ms google.com enter)
Splitting into smaller tokens serves as an escaping mechanism: _macro(space)_
inserts a space but _macro(s pace)_ writes "space". Likewise, _macro(3+5)_
depresses the 3 and 5 keys as a unit while _macro(3 + 5)_ writes "3+5".
Some prerequisites are needed for non-ASCII characters to work, see _Unicode Support_.
# ACTIONS
A key may optionally be bound to an _action_ which accepts zero or more arguments.
*layer(<layer>)*
Activate the given layer for the duration of the keypress.
*oneshot(<layer>)*
If tapped, activate the supplied layer for the duration of the next keypress.
*swap(<layer>)*
Swap the currently active layer with the supplied one. If the current
layer is toggled, it is deactivated and the supplied layer is toggled
instead. Otherwise, the active layer is deactivated and the supplied
layer remains active for the duration of the depression of the
activating key. The behaviour of this action is undefined for
composite layers.
```
[control]
x = swap(xlayer)
[xlayer]
s = C-s
b = S-insert
```
NOTE:
You probably don't need to use this unless you are trying to do something quite
involved. Think hard about whether or not what you are trying to achieve
can be done by other means, as it is easy to end up in states which
are impossible to exit.
*setlayout(<layout>)*
Set the current layout.
*clear()*
Clear any toggled or oneshot layers.
*toggle(<layer>)*
Permanently toggle the state of the given layer.
*layerm(<layer>, <macro>)*
Identical to *layer*, but executes the supplied macro before the layer change.
*oneshotm(<layer>, <macro>)*
Identical to *oneshot*, but executes the supplied macro before the layer change.
*swapm(<layer>, <macro>)*
Identical to *swap*, but accepts a macro to be executed immediately
after the layer change.
*togglem(<layer>, <macro>)*
Equivalent to *toggle*, but additionally executes the supplied macro before
toggling the layer.
*clearm(<macro>)*
Identical to *clear*, but executes the supplied macro before clearing layers.
## Key overloading
*overload(<layer>, <action>)*
Activates the given layer while held and executes <action> on tap.
*overloadt(<layer>, <action>, <timeout>)*
Identical to overload, but only activates the layer if the bound key is
held for \<timeout\> milliseconds. This is mainly useful for overloading keys
which are commonly struck in sequence (e.g letter keys).
Note that this will add a visual delay when typing, since overlapping
keys will be queued until the timeout expires or the bound key is
released.
*overloadt2(<layer>, <action>, <timeout>)*
Identical to overloadt, but additionally resolves as a hold in the
event of an intervening key tap.
*overloadi(<action 1>, <action 2>, <idle timeout>)*
Activate <action 1> if the last non-action (i.e symbol) key was struck less
than <timeout> milliseconds ago, otherwise activate <action 2>.
This can be used in combination with other overload timeouts and is particularly
useful for overloading letter keys (often called 'homerow mods').
For example:
```
a = overloadi(a, overloadt2(control, a, 200), 150)
```
will produce _a_ if and only if:
- _a_ is struck within 150ms of another non-action key.
- _a_ is struck more than 150ms after the last non-action key but held for less than 200ms
and there are no intervening key taps.
This reduces the visual latency by immediately resolving the key as a letter when
typed midword, but also facilitates its use as a layer trigger if it is held for a long
enough period with no intervening symbols.
Since this is a common usecase, a macro called *lettermod* (defined below) has been
defined to facilitate such definitions.
*lettermod(<layer>, <key>, <idle timeout>, <hold timeout>)*
An alias for:
*overloadi(<key>, overloadt2(<layer>, <key>, <hold timeout>), <idle timeout>)*
*timeout(<action 1>, <timeout>, <action 2>)*
If no key events occur within _<timeout> ms_, execute <action1>, otherwise
execute <action1>.
E.g.
timeout(a, 500, layer(control))
Will cause the assigned key to behave as control if it is held for more than
500 ms without any keys being struck in the interval.
*NOTE:* This is an older option with numerous subtle implications. It is
mainly intended to be used in combination with other actions to achieve
things which are not otherwise possible. Most users will want to use
one of overload functions for simple tap/hold behaviour.
*macro2(<timeout>, <repeat timeout>, <macro>)*
Creates a macro with the given timeout and repeat timeout. If a timeout value of 0 is used,
macro repeat is disabled.
Note that <macro> must be a valid macro expression.
E.g.
```
macro2(400, 50, macro(Hello space World))
macro2(120, 80, left)
```
*command(<shell command>)*
Execute the given shell command.
E.g.
command(brightness down)
*NOTE:* Commands are executed by the user running the keyd process (probably root),
use this feature judiciously.
*noop*
Do nothing.
# IPC
To facilitate extensibility, keyd employs a client-server model accessible
through the use of *-e*. The keymap can thus be conceived of as a
living entity that can be modified at run time.
In addition to allowing the user to try new bindings on the fly, this
enables the user to fully leverage keyd's expressive power from other programs
without incurring a performance penalty.
For instance, the user may use this functionality to write a script which
alters the keymap when they switch between different tmux sessions.
The application remapping tool (*keyd-application-mapper(1)*) which ships with keyd
is a good example of this. It is a small python script which performs event
detection for the various display servers (e.g X/sway/gnome, etc) and feeds the
desired mappings to the core using _-e_.
*NOTE:* Users with access to the keyd socket should be considered privileged
(i.e assumed to have access to the entire system.).
## Bindings
The _bind_ command accepts one or more _bindings_, each of which must have the following form:
\[<layer>.\]<key> = <key>|<macro>|<action>
Where _<layer>_ is the name of an (existing) layer in which the key is to be bound.
As a special case, the string "reset" may be used in place of a binding, in
which case the current keymap will revert to its original state (all
dynamically applied bindings will be dropped).
Examples:
```
$ keyd bind '- = C-c'
$ keyd bind reset '+ = C-c' # Reset the keyboard before applying the '+' binding (drops the previous '-' binding)
```
By default expressions apply to the most recently active keyboard.
# EXAMPLES
## Example 1
Make _esc+q_ toggle the dvorak letter layout.
```
[ids]
*
[main]
esc = layer(esc)
[dvorak]
a = a
s = o
...
[esc]
q = toggle(dvorak)
```
## Example 2
Invert the behaviour of the shift key without breaking modifier behaviour.
```
[ids]
*
[main]
1 = !
2 = @
3 = #
4 = $
5 = %
6 = ^
7 = &
8 = *
9 = (
0 = )
[shift]
0 = 0
1 = 1
2 = 2
3 = 3
4 = 4
5 = 5
6 = 6
7 = 7
8 = 8
9 = 9
```
## Example 3
Tapping control once causes it to apply to the next key, tapping it twice
activates it until it is pressed again, and holding it produces expected
behaviour.
```
[main]
control = oneshot(control)
[control]
control = toggle(control)
```
## Example 4
Meta behaves as normal except when \` is pressed, after which the alt_tab layer
is activated for the duration of the leftmeta keypress. Subsequent actuations
_will thus produce A-tab instead of M-\\_.
```
[meta]
` = swap(alt_tab, A-tab)
[alt_tab:A]
tab = A-S-tab
` = A-tab
```
## Example 5
```
# Uses the compose key functionality of the display server to generate
# international glyphs. # For this to work 'setxkbmap -option
# compose:menu' must # be run after keyd has started.
# A list of sequences can be found in /usr/share/X11/locale/en_US.UTF-8/Compose
# on most systems.
[main]
rightalt = layer(dia)
[dia]
# Map o to ö
o = macro(compose o ")
# Map e to €
e = macro(compose c =)
```
## Example 6
```
# Tapping both shift keys will activate capslock.
[shift]
leftshift = capslock
rightshift = capslock
```
## Example 7
Capslock will behave as control in all instances except when used
in conjunction with 'h/j/k/l' in which case it will produce arrow
keys. If tapped, it will function as escape.
```
[main]
capslock = overload(capslock, esc)
esc = capslock
[capslock:C]
h = left
k = up
j = down
l = right
```
## Example 8
Disables the esc and end keys.
```
[main]
esc = noop
end = noop
```
# ENVIRONMENT VARIABLES
*KEYD_DEBUG*
Debug log level. _0_,_1_,_2_ can be specified (default: 0).
# AUTHOR
Written by Raheman Vaiya (2017-).
# BUGS
Please file any bugs or feature requests at the following url:
<https://github.com/rvaiya/keyd/issues>

View file

@ -0,0 +1,14 @@
# Usage: Place this file /etc/keyd/default.conf
# Causes `capslock` to behave as `control` when pressed
# and escape when tapped. Note that `control` is what
# keyd regards as a 'modifier layer'.
# See the man page for more details.
[ids]
*
[main]
capslock = overload(control, esc)

View file

@ -0,0 +1,38 @@
# NOTE: to use this, rename this file to default.conf and put in /etc/keyd/
# Advanced use of capslock as a triple function key:
#
# - when 'capslock' is tapped (pressed + released), it behaves as ESC key
#
# - when 'capslock' is held, and used in combination with another key, it
# behaves like a 'ctrl' key modifier (just like xcape)
#
# - when 'capslock' is held, and the 'space' key is tapped, we enter a 3rd
# state for "VIM mode" where hjkl keys become arrow keys until capslock
# is released.
#
[ids]
*
[main]
capslock = overload(ctrl_vim, esc)
# ctrl_vim modifier layer; inherits from 'Ctrl' modifier layer
[ctrl_vim:C]
space = swap(vim_mode)
# vim_mode modifier layer; also inherits from 'Ctrl' modifier layer
[vim_mode:C]
h = left
j = down
k = up
l = right
# forward word
w = C-right
# backward word
b = C-left

View file

@ -0,0 +1,65 @@
# NOTE: to use this, rename this file to default.conf or `your-chomebook-keyboard-name`.conf and put in /etc/keyd/
# This is an chromebook like configuration, this remaps function keys 1 through 10 to fall in line with the chromeos remapping
# while still allowing for full access to standard linux functions that rely on those function keys, such as TTY access or
# terminal programs
# Using this on an chromebook that has been modified to run linux will make the function keys work as designed originally
# for the most part, F4 and F5 are mapped differently due to limitations of `keyd` and lack of functional support for their features
# in most linux desktop environments
# pressing meta+Fn will trigger that FN key
# pressing ctrl+alt+Fn will trigger that key stroke
[ids]
*
## Chromebook function keys
[main]
f1 = back
f2 = forward
f3 = refresh
f4 = print
f5 = A-tab
f6 = brightnessdown
f7 = brightnessup
f8 = mute
f9 = volumedown
f10 = volumeup
## Allow F1-10 access through meta+fnX
[meta]
f1 = f1
f2 = f2
f3 = f3
f4 = f4
f5 = f5
f6 = f6
f7 = f7
f8 = f8
f9 = f9
f10 = f10
## Allow TTY access
[control+alt]
f1 = C-A-f1
f2 = C-A-f2
f3 = C-A-f3
f4 = C-A-f4
f5 = C-A-f5
f6 = C-A-f6
f7 = C-A-f7
f8 = C-A-f8
f9 = C-A-f9
f10 = C-A-f10
left = home
right = end
[control+alt]
up = home
down = end
[alt]
backspace = delete
up = pageup
down = pagedown

View file

@ -0,0 +1,37 @@
# This example demonstrates how to implement a variant of the Extend layer. Notice how
# you can pin the layer down with the space bar if you need to do complex operations
# using the fingers of both hands. Vim users might prefer to bind left, down up and right
# to h, j, k and l respectively.
[ids]
*
[main]
capslock = overload(extend, capslock)
[extend]
q = overload(alt, escape)
y = pageup
u = home
i = up
o = end
p = insert
a = leftcontrol
s = leftshift
d = leftmeta
f = leftalt
h = pagedown
j = left
k = down
l = right
semicolon = delete
apostrophe = esc
n = compose
m = backspace
comma = space
dot = tab
slash = enter
space = overload(extend, capslock)

View file

@ -0,0 +1,82 @@
# NOTE: to use this, rename this file to default.conf and put in /etc/keyd/
#
# Half-QWERTY emulation example. This is useful for one-handed typing.
[ids]
*
[main]
# Maps capslock to escape when pressed and control when held.
capslock = overload(control, esc)
# Space becomes a modifier when pressed in combination with another key,
# otherwise outputs a regular space character. When this modifier is used, the
# keys are mirrored to the other half of the keyboard.
space = overload(mirroring, space)
# Single quote becomes Ctrl when combined.
' = overload(control, ')
# Alt+Tab is a common combination for switcing windows. When typing with the
# right hand it requires pressing space+[+Alt. Adding F12 as another Tab makes
# it easier.
f12 = tab
[mirroring]
6 = 5
7 = 4
8 = 3
9 = 2
0 = 1
- = `
h = g
j = f
k = d
l = s
semicolon = a
y = t
u = r
i = e
o = w
p = q
[ = tab
] = tab
\ = esc
n = b
m = v
, = c
. = x
/ = z
1 = 0
2 = 9
3 = 8
4 = 7
5 = 6
tab = delete
q = p
w = o
e = i
r = u
t = y
a = ;
s = l
d = k
f = j
g = h
z = /
x = .
c = ,
v = m
b = n
# TODO: Map space+capslock to return. The naive approach below does not work.
# capslock = return

View file

@ -0,0 +1,24 @@
# This example demonstrates how to implement one of the variants of home row modifers.
# Notice we use the one-shot-shift pattern. This is important to prevent shifting errors
# caused by the necessary delay with which characters are emitted under overloadt (on
# release, instead of on press). It is not recommended to use home-row shift for typing
# for that reason. Home row modifiers are best suited for combinations (i.e., shortcuts).
[ids]
*
[main]
a = overloadt(control, a, 200)
s = overloadt(shift, s, 200)
d = overloadt(meta, d, 200)
f = overloadt(alt, f, 200)
j = overloadt(alt, j, 200)
k = overloadt(meta, k, 200)
l = overloadt(shift, l, 200)
; = overloadt(control, ;, 200)
v = overloadt(altgr, v, 200)
m = overloadt(altgr, m, 200)
leftshift = oneshot(shift)
rightshift = oneshot(shift)

View file

@ -0,0 +1,23 @@
# This config demonstrates how international characters can be mapped using
# keyd. It works by using the display server's (i.e wayland/X) compose key
# functionality in conjunction with macros to generate the glyph of interest.
# For this to work 'setxkbmap -option compose:menu' must be run after keyd has started.
# A list of compose sequences can be found in /usr/share/X11/locale/en_US.UTF-8/Compose on most systems.
[ids]
*
[main]
rightalt = layer(dia)
[dia]
# Map o to ö
o = macro(compose o ")
# Map e to €
e = macro(compose c =)

View file

@ -0,0 +1,38 @@
# This example demostrates how to implement a layer carousel which behaves as follows:
# - Hold space (numbers layer)
# - Tap right shift (functions layer)
# - Tap left shift (numbers layer)
# - Tap left shift (symbols layer)
# - Release space (main layer)
# By using swap in our secondary layers, the layer held by space (as determined in the
# main layer) is replaced and remains active until another swap takes place or the space
# is eventually released, which brings us back to the main layer.
[ids]
*
[main]
space = overloadt(numbers, space, 200)
[numbers]
a = 1
# Other numbers here.
leftshift = overload(shift, swap(symbols))
rightshift = overload(shift, swap(functions))
[functions]
a = f1
# Other functions here.
leftshift = overload(shift, swap(numbers))
rightshift = overload(shift, swap(symbols))
[symbols]
a = grave
# Other symbols here.
leftshift = overload(shift, swap(functions))
rightshift = overload(shift, swap(numbers))

View file

@ -0,0 +1,80 @@
# NOTE: to use this, rename this file to default.conf and put in /etc/keyd/
# Mac-Like Configuration Example
#
# Uses "Alt" button to the left of spacebar as "Cmd" key
#
# Note:
# This 'trick' generally requires that the press+release of the Meta
# key will do nothing. On my system, I had to disable the "overlay-key"
# in mutter to make it inert:
# - `gsettings set org.gnome.mutter overlay-key ''`
[ids]
*
[main]
# Create a new "Cmd" button, with various Mac OS-like features below
leftalt = layer(meta_mac)
# Swap meta/alt
leftmeta = alt
# meta_mac modifier layer; inherits from 'Ctrl' modifier layer
#
# The main part! Using this layer, we can remap our new "Cmd" key to
# do almost everything our muscle memory might need...
[meta_mac:C]
# Meta-Space: Open the Launcher (a feature of gnome-shell)
# keybinding: ? how did we arrive at M-/ ?
space = M-/
# Switch directly to an open tab (e.g. Firefox, VS code)
1 = A-1
2 = A-2
3 = A-3
4 = A-4
5 = A-5
6 = A-6
7 = A-7
8 = A-8
9 = A-9
# Copy
c = C-insert
# Paste
v = S-insert
# Cut
x = S-delete
# Move cursor to beginning of line
left = home
# Move cursor to end of Line
right = end
# As soon as tab is pressed (but not yet released), we switch to the
# "app_switch_state" overlay where we can handle Meta-Backtick differently.
# Also, send a 'M-tab' key tap before entering app_switch_sate.
tab = swapm(app_switch_state, M-tab)
# Meta-Backtick: Switch to next window in the application group
# - A-f6 is the default binding for 'cycle-group' in gnome
# - keybinding: `gsettings get org.gnome.desktop.wm.keybindings cycle-group`
` = A-f6
# app_switch_state modifier layer; inherits from 'Meta' modifier layer
[app_switch_state:M]
# Meta-Tab: Switch to next application
# - keybinding: `gsettings get org.gnome.desktop.wm.keybindings switch-applications`
tab = M-tab
right = M-tab
# Meta-Backtick: Switch to previous application
# - keybinding: `gsettings get org.gnome.desktop.wm.keybindings switch-applications-backward`
` = M-S-tab
left = M-S-tab

View file

@ -0,0 +1,53 @@
# Goal:
#
# To create a vi like navigation layer accessible by holding capslock while holding capslock
# otherwise behave like the control key (when held) and escape when tapped.
#
# In essence we want:
#
# - capslock+h = left
# - capslock+j = down
# - capslock+k = up
# - capslock+l = right
#
# - capslock+shift+h = C-left
# - capslock+shift+l = C-right
# - capslock+shift+j = C-down
# - capslock+shift+k = C-up
#
# - capslock = escape (when tapped)
#
# In all other instances capslock should behave as normal control:
#
# - capslock+a = C-a
# - capslock+b = C-b
# - capslock+c = C-c
# ...
# - capslock+shift+i = C-S-i
# - capslock+shift+k = C-S-k
# ....
# This is achieved by creating a composite layer called [capslock+shift]
# which is activated whenever capslock and shift are simultaneously
# held.
[ids]
*
[main]
capslock = overload(capslock, esc)
[capslock:C]
h = left
j = down
k = up
l = right
# Activates when both capslock and shift is pressed
[capslock+shift]
h = C-left
j = C-down
k = C-up
l = C-right

View file

@ -0,0 +1,15 @@
# This example demostrates how to use the space-bar as a shift key by:
# 1. Holding shift
# 2. Holding space
# 3. Releasing shift
# The space-bar will keep the shift layer active until your release it. The advanteage is
# that you can type using the fingers of both hands freely. Consider it as an alternative
# to caps-word mode (see issue #711).
[ids]
*
[shift]
space = overloadt(shift, space, 200)

View file

@ -0,0 +1,18 @@
# This example demonstrates what is sometimes called a simlayer: when the layer is
# activated, if no action is taken within a specified period of time, another action
# takes place. This can be used, for example, to preserve the repeat action of the key
# that is being overloaded (backspace in this case).
[ids]
*
[main]
backspace = timeout(overload(shortcuts, backspace), 500, backspace)
[shortcuts]
1 = M-pageup
2 = M-pagedown
# Other shortcuts here.

View file

@ -0,0 +1,9 @@
[Unit]
Description=key remapping daemon
[Service]
Type=simple
ExecStart=@PREFIX@/bin/keyd
[Install]
WantedBy=multi-user.target

View file

@ -0,0 +1,127 @@
[af:layout]
' = گ
, = و
- = -
. = .
/ = /
1 = ۱
2 = ۲
3 = ۳
4 = ۴
5 = ۵
6 = ۶
7 = ۷
8 = ۸
9 = ۹
; = ک
= = =
[ = ج
\ = \
] = چ
a = ش
b = ذ
c = ز
d = ی
e = ث
f = ب
g = ل
h = ا
i = ه
j = ت
k = ن
l = م
m = پ
n = د
o = خ
p = ح
q = ض
r = ق
s = س
t = ف
u = ع
v = ر
w = ص
x = ط
y = غ
z = ظ
shift = layer(af_shift)
altgr = layer(af_altgr)
[af_shift:S]
' = ؛
, = >
- = ـ
. = <
/ = ؟
1 = !
2 = ٬
3 = ٫
4 = 
5 = ٪
6 = ×
7 = ،
8 = *
; = :
= = +
[ = }
\ = |
] = {
a = ؤ
b =
c = ژ
d = ي
e = ٍ
f = إ
g = أ
h = آ
i = ّ
j = ة
m = ء
n = ٔ
o = ]
p = [
q = ْ
r = ً
s = ئ
t = ُ
u = َ
v = ٰ
w = ٌ
x = ٓ
y = ِ
z = ك
[af_altgr:G]
' = ګ
. = ۇ
/ = ۉ
3 = #
8 = •
9 =
[ = ځ
] = څ
a = ښ
b = ڈ
c = ږ
d = ى
e = €
f = ې
g = ڷ
h = ٱ
i = ٕ
j = ټ
k = ڼ
l = ں
m = ٹ
n = ډ
r =
s = ۍ
t = ﴿
u = 
v = ړ
x = ڑ
y = 
z = ے
[af_altgr+af_shift]

View file

@ -0,0 +1,169 @@
[al:layout]
' = [
, = ,
- = -
. = .
/ = /
1 = 1
2 = 2
3 = 3
4 = 4
5 = 5
6 = 6
7 = 7
8 = 8
9 = 9
; = ë
= = =
[ = ç
\ = ]
] = @
a = a
b = b
c = c
d = d
e = e
f = f
g = g
h = h
i = i
j = j
k = k
l = l
m = m
n = n
o = o
p = p
q = q
r = r
s = s
t = t
u = u
v = v
w = w
x = x
y = z
z = y
shift = layer(al_shift)
altgr = layer(al_altgr)
[al_shift:S]
' = {
, = ;
- = _
. = :
/ = ?
1 = !
2 = "
3 = #
4 = $
5 = %
6 = ^
7 = &
8 = *
9 = (
; = Ë
= = +
[ = Ç
\ = }
] = '
a = A
b = B
c = C
d = D
e = E
f = F
g = G
h = H
i = I
j = J
k = K
l = L
m = M
n = N
o = O
p = P
q = Q
r = R
s = S
t = T
u = U
v = V
w = W
x = X
y = Z
z = Y
[al_altgr:G]
' = ß
, = <
. = >
1 = ~
7 = `
; = $
[ = ÷
\ = ¤
] = ×
a = æ
b = {
c = ¢
d = Đ
e = €
f = [
g = ]
h = ħ
i = →
k = ł
l = ł
m = §
n = }
o = ø
p = þ
q = \
r = ¶
s = đ
t = ŧ
u = ↓
v = @
w = |
x = »
y = ←
z = «
[al_altgr+al_shift]
, = ×
- = ¿
. = ÷
2 = ⅛
3 = £
4 = $
5 = ⅜
6 = ⅝
8 = ™
9 = ±
a = Æ
b = '
c = ©
d = Ð
e = €
f = ª
g = Ŋ
h = Ħ
i = ı
k = &
l = Ł
m = º
n = }
o = Ø
p = Þ
q = Ω
r = ®
s = §
t = Ŧ
u = ↑
v = `
w = §
x = >
y = ¥
z = <

View file

@ -0,0 +1,95 @@
[am:layout]
' = ր
, = խ
- = է
. = շ
/ = ռ
1 = ֆ
2 = ձ
3 = ֊
4 = ,
5 = ։
6 = ՞
7 =
8 = ՛
9 = )
; = պ
= = ղ
[ = ծ
\ = »
] = ց
a = ջ
b = զ
c = չ
d = գ
e = բ
f = ե
g = ա
h = ն
i = կ
j = ի
k = տ
l = հ
m = ք
n = լ
o = ը
p = թ
q = ճ
r = ս
s = վ
t = մ
u = ւ
v = յ
w = փ
x = դ
y = ո
z = ժ
shift = layer(am_shift)
[am_shift:S]
' = Ր
, = Խ
- = Է
. = Շ
/ = Ռ
1 = Ֆ
2 = Ձ
3 = —
4 = $
5 = …
6 = %
7 = և
8 = ՚
9 = (
; = Պ
= = Ղ
[ = Ծ
\ = «
] = Ց
a = Ջ
b = Զ
c = Չ
d = Գ
e = Բ
f = Ե
g = Ա
h = Ն
i = Կ
j = Ի
k = Տ
l = Հ
m = Ք
n = Լ
o = Ը
p = Թ
q = Ճ
r = Ս
s = Վ
t = Մ
u = Ւ
v = Յ
w = Փ
x = Դ
y = Ո
z = Ժ

View file

@ -0,0 +1,147 @@
[ara:layout]
' = ط
, = و
- = -
. = ز
/ = ظ
` = ذ
1 = 1
2 = 2
3 = 3
4 = 4
5 = 5
6 = 6
7 = 7
8 = 8
9 = 9
; = ك
= = =
[ = ج
\ = \
] = د
a = ش
b = ﻻ
c = ؤ
d = ي
e = ث
f = ب
g = ل
h = ا
i = ه
j = ت
k = ن
l = م
m = ة
n = ى
o = خ
p = ح
q = ض
r = ق
s = س
t = ف
u = ع
v = ر
w = ص
x = ء
y = غ
z = ئ
shift = layer(ara_shift)
altgr = layer(ara_altgr)
[ara_shift:S]
' = "
, = ,
- = _
. = .
/ = ؟
` = ّ
1 = !
2 = @
3 = #
4 = $
5 = %
6 = ^
7 = &
8 = *
9 = )
0 = (
; = :
= = +
[ = <
\ = …
] = >
a = ِ
b = ﻵ
c = }
d = ]
e = ُ
f = [
g = ﻷ
h = أ
i = ÷
j = ـ
k = ،
l = /
m = '
n = آ
o = ×
p = ؛
q = َ
r = ٌ
s = ٍ
t = ﻹ
u = `
v = {
w = ً
x = ْ
y = إ
z = ~
[ara_altgr:G]
' = ⟩
, = ٬
- =
. = ژ
/ = ٭
1 = ١
2 = ٢
3 = ٣
4 = ٤
5 = ٥
6 = ٦
7 = ٧
8 = ٨
9 = ٩
0 = ̥
; = گ
= = ≠
[ = چ
\ = ⟨
f = پ
h = ٱ
k = ٫
n = ٰ
t = ڤ
x = «
z = »
[ara_altgr+ara_shift]
' =
- =
/ =
5 = ‰
= = ≈
[ =
\ =
] = ؜
e =
i =
p =
q =
r =
u =
w =
x =
y =
z =

View file

@ -0,0 +1,177 @@
[at:layout]
' = ä
, = ,
- = ß
. = .
/ = -
1 = 1
2 = 2
3 = 3
4 = 4
5 = 5
6 = 6
7 = 7
8 = 8
9 = 9
; = ö
[ = ü
\ = #
] = +
a = a
b = b
c = c
d = d
e = e
f = f
g = g
h = h
i = i
j = j
k = k
l = l
m = m
n = n
o = o
p = p
q = q
r = r
s = s
t = t
u = u
v = v
w = w
x = x
y = z
z = y
shift = layer(at_shift)
altgr = layer(at_altgr)
[at_shift:S]
' = Ä
, = ;
- = ?
. = :
/ = _
1 = !
2 = "
3 = §
4 = $
5 = %
6 = &
7 = /
8 = (
9 = )
; = Ö
[ =
\ = '
] = *
a = A
b = B
c = C
d = D
e = E
f = F
g = G
h = H
i = I
j = J
k = K
l = L
m = M
n = N
o = O
p = P
q = Q
r = R
s = S
t = T
u = U
v = V
w = W
x = X
y = Z
z = Y
[at_altgr:G]
, = ·
- = \
. = …
/ =
1 = ¹
2 = ²
3 = ³
4 = ¼
5 = ½
6 = ¬
7 = {
8 = [
9 = ]
\ =
] = ~
a = æ
b = “
c = ¢
d = ð
e = €
f = đ
g = ŋ
h = ħ
i = →
k = ĸ
l = ł
m = µ
n = ”
o = ø
p = þ
q = @
r = ¶
s = ſ
t = ŧ
u = ↓
v = „
w = ſ
x = «
y = ←
z = »
[at_altgr+at_shift]
, = ×
- = ¿
. = ÷
/ = —
1 = ¡
2 = ⅛
3 = £
4 = ¤
5 = ⅜
6 = ⅝
7 = ⅞
8 = ™
9 = ±
] = ¯
a = Æ
b =
c = ©
d = Ð
e = €
f = ª
g = Ŋ
h = Ħ
i = ı
k = &
l = Ł
m = º
n =
o = Ø
p = Þ
q = Ω
r = ®
s = ẞ
t = Ŧ
u = ↑
v =
w = §
x =
y = ¥
z =

View file

@ -0,0 +1,95 @@
[au:layout]
' = '
, = ,
- = -
. = .
/ = /
1 = 1
2 = 2
3 = 3
4 = 4
5 = 5
6 = 6
7 = 7
8 = 8
9 = 9
; = ;
= = =
[ = [
\ = \
] = ]
a = a
b = b
c = c
d = d
e = e
f = f
g = g
h = h
i = i
j = j
k = k
l = l
m = m
n = n
o = o
p = p
q = q
r = r
s = s
t = t
u = u
v = v
w = w
x = x
y = y
z = z
shift = layer(au_shift)
[au_shift:S]
' = "
, = <
- = _
. = >
/ = ?
1 = !
2 = @
3 = #
4 = $
5 = %
6 = ^
7 = &
8 = *
9 = (
; = :
= = +
[ = {
\ = |
] = }
a = A
b = B
c = C
d = D
e = E
f = F
g = G
h = H
i = I
j = J
k = K
l = L
m = M
n = N
o = O
p = P
q = Q
r = R
s = S
t = T
u = U
v = V
w = W
x = X
y = Y
z = Z

View file

@ -0,0 +1,95 @@
[az:layout]
' = ə
, = ç
- = -
. = ş
/ = .
1 = 1
2 = 2
3 = 3
4 = 4
5 = 5
6 = 6
7 = 7
8 = 8
9 = 9
; = ı
= = =
[ = ö
\ = \
] = ğ
a = a
b = b
c = c
d = d
e = e
f = f
g = g
h = h
i = i
j = j
k = k
l = l
m = m
n = n
o = o
p = p
q = q
r = r
s = s
t = t
u = u
v = v
w = ü
x = x
y = y
z = z
shift = layer(az_shift)
[az_shift:S]
' = Ə
, = Ç
- = _
. = Ş
/ = ,
1 = !
2 = "
3 = Ⅶ
4 = ;
5 = %
6 = :
7 = ?
8 = *
9 = (
; = I
= = +
[ = Ö
\ = /
] = Ğ
a = A
b = B
c = C
d = D
e = E
f = F
g = G
h = H
i = İ
j = J
k = K
l = L
m = M
n = N
o = O
p = P
q = Q
r = R
s = S
t = T
u = U
v = V
w =
x = X
y = Y
z = Z

View file

@ -0,0 +1,171 @@
[ba:layout]
' = ć
, = ,
- = '
. = .
/ = -
1 = 1
2 = 2
3 = 3
4 = 4
5 = 5
6 = 6
7 = 7
8 = 8
9 = 9
; = č
= = +
[ = š
\ = ž
] = đ
a = a
b = b
c = c
d = d
e = e
f = f
g = g
h = h
i = i
j = j
k = k
l = l
m = m
n = n
o = o
p = p
q = q
r = r
s = s
t = t
u = u
v = v
w = w
x = x
y = z
z = y
shift = layer(ba_shift)
altgr = layer(ba_altgr)
[ba_shift:S]
' = Ć
, = ;
- = ?
. = :
/ = _
1 = !
2 = "
3 = #
4 = $
5 = %
6 = &
7 = /
8 = (
9 = )
; = Č
= = *
[ = Š
\ = Ž
] = Đ
a = A
b = B
c = C
d = D
e = E
f = F
g = G
h = H
i = I
j = J
k = K
l = L
m = M
n = N
o = O
p = P
q = Q
r = R
s = S
t = T
u = U
v = V
w = W
x = X
y = Z
z = Y
[ba_altgr:G]
' = ß
, = <
. = >
/ = —
[ = ÷
\ = ¤
] = ×
a = æ
b = {
c = ¢
d = “
e = €
f = [
g = ]
h = ħ
i = →
k = ł
l = ł
m = §
n = }
o = ø
p = þ
q = \
r = ¶
s = „
t = ŧ
u = ↓
v = @
w = |
x =
y = ←
z =
[ba_altgr+ba_shift]
, = ×
- = ¨
. = ÷
/ =
1 = ~
2 = ˇ
3 = ^
4 = ˘
5 = °
6 = ˛
7 = `
8 = ˙
9 = '
= = ¸
a = Æ
b = '
c = ©
d = «
e = €
f = ª
g = Ŋ
h = Ħ
i = ı
k = &
l = Ł
m = º
n = }
o = Ø
p = Þ
q = Ω
r = ®
s = »
t = Ŧ
u = ↑
v = `
w = Ł
x = «
y = ¥
z = »

View file

@ -0,0 +1,135 @@
[bd:layout]
' = '
, = ,
- = -
. = .
/ = /
1 = ১
2 = ২
3 = ৩
4 =
5 = ৫
6 = ৬
7 =
8 = ৮
9 = ৯
; = ;
= = =
[ = [
\ = \
] = ]
a = ৃ
b = ন
c = ে
d = ি
e = ড
f = ব
g = ্
h = া
i = হ
j = ক
k = ত
l = দ
m = ম
n = স
o = গ
p = ড়
q = ঙ
r = প
s = ু
t = ট
u = জ
v = র
w = য
x = ো
y = চ
z = ঁ
shift = layer(bd_shift)
altgr = layer(bd_altgr)
[bd_shift:S]
' = "
, = <
- = _
. = >
/ = ?
1 = !
2 = @
3 = #
4 = $
5 = %
6 = ^
7 = &
8 = *
9 = (
; = :
= = +
[ = {
\ = |
] = }
a = ৗ
b = ণ
c = ৈ
d = ী
e = ঢ
f = ভ
g = ।
h = অ
i = ঞ
j = খ
k = থ
l = ধ
m = শ
n = ষ
o = ঘ
p = ঢ়
q = ং
r = ফ
s = ূ
t = ঠ
u = ঝ
v = ল
w = য়
x = ৌ
y = ছ
z = ঃ
[bd_altgr:G]
- =
. = ়
1 = ৴
2 = ৵
3 = ৶
4 = ৳
5 = ৷
6 = ৸
7 = ं
= =
a = ঋ
c = এ
d = ই
e = ৄ
f = ৰ
g = ॥
h = আ
i = ঽ
j = ঻
k = ৎ
l = ঌ
q = ৢ
s = উ
x = ও
z = ৺
[bd_altgr+bd_shift]
4 = ৲
6 = ঳
a = ৠ
c = ঐ
d = ঈ
f = ৱ
l = ৡ
q = ৣ
s = ঊ
x = ঔ

View file

@ -0,0 +1,173 @@
[be:layout]
' = ù
, = ;
- = )
. = :
/ = =
1 = &
2 = é
3 = "
4 = '
5 = (
6 = §
7 = è
8 = !
9 = ç
; = m
= = -
\ = µ
] = $
a = q
b = b
c = c
d = d
e = e
f = f
g = g
h = h
i = i
j = j
k = k
l = l
m = ,
n = n
o = o
p = p
q = a
r = r
s = s
t = t
u = u
v = v
w = z
x = x
y = y
z = w
shift = layer(be_shift)
altgr = layer(be_altgr)
[be_shift:S]
' = %
, = .
- = °
. = /
/ = +
1 = 1
2 = 2
3 = 3
4 = 4
5 = 5
6 = 6
7 = 7
8 = 8
9 = 9
; = M
= = _
\ = £
] = *
a = Q
b = B
c = C
d = D
e = E
f = F
g = G
h = H
i = I
j = J
k = K
l = L
m = ?
n = N
o = O
p = P
q = A
r = R
s = S
t = T
u = U
v = V
w = Z
x = X
y = Y
z = W
[be_altgr:G]
, = •
- = \
. = ·
1 = |
2 = @
3 = #
4 = ¼
5 = ½
6 = ^
7 = {
8 = [
9 = {
[ = [
] = ]
a = æ
b = “
c = ¢
d = ð
e = €
f = đ
g = ŋ
h = ħ
i = →
k = ĸ
l = ł
n = ”
o = œ
p = þ
q = @
r = ¶
s = ß
t = ŧ
u = ↓
v = „
w = ſ
x = »
y = ←
z = «
[be_altgr+be_shift]
, = ×
- = ¿
. = ÷
1 = ¡
2 = ⅛
3 = £
4 = $
5 = ⅜
6 = ⅝
7 = ⅞
8 = ™
9 = ±
a = Æ
b =
c = ©
d = Ð
e = ¢
f = ª
g = Ŋ
h = Ħ
i = ı
k = &
l = Ł
m = º
n =
o = Œ
p = Þ
q = Ω
r = ®
s = ẞ
t = Ŧ
u = ↑
v =
w = §
x = >
y = ¥
z = <

View file

@ -0,0 +1,136 @@
[bg:layout]
' = ч
, = р
- = -
. = л
/ = б
1 = 1
2 = 2
3 = 3
4 = 4
5 = 5
6 = 6
7 = 7
8 = 8
9 = 9
; = м
= = .
[ = ц
\ = „
] = ;
a = ь
b = ф
c = ъ
d = а
e = е
f = о
g = ж
h = г
i = с
j = т
k = н
l = в
m = п
n = х
o = д
p = з
q = ,
r = и
s = я
t = ш
u = к
v = э
w = у
x = й
y = щ
z = ю
shift = layer(bg_shift)
altgr = layer(bg_altgr)
[bg_shift:S]
' = Ч
, = Р
- = $
. = Л
/ = Б
1 = !
2 = ?
3 = +
4 = "
5 = %
6 = =
7 = :
8 = /
9 =
; = М
= = €
[ = Ц
\ = “
] = §
a = ѝ
b = Ф
c = Ъ
d = А
e = Е
f = О
g = Ж
h = Г
i = С
j = Т
k = Н
l = В
m = П
n = Х
o = Д
p = З
q = ы
r = И
s = Я
t = Ш
u = К
v = Э
w = У
x = Й
y = Щ
z = Ю
[bg_altgr:G]
, = ®
- =
3 = †
5 = 〈
6 = —
7 = …
8 = ̀
\ = «
a = ы
c = ѫ
e = э
i = ©
j = ™
q =
r = ѝ
s = ѣ
u = ©
x = ѭ
[bg_altgr+bg_shift]
, = ®
- = €
3 = †
5 = 〉
6 = —
7 = …
8 = ́
\ = »
a = Ы
c = Ѫ
e = Э
i = ©
j = ™
q =
r = Ѝ
s = Ѣ
u = ©
x = Ѭ

View file

@ -0,0 +1,177 @@
[br:layout]
, = ,
- = -
. = .
/ = ;
1 = 1
2 = 2
3 = 3
4 = 4
5 = 5
6 = 6
7 = 7
8 = 8
9 = 9
; = ç
= = =
\ = ]
] = [
a = a
b = b
c = c
d = d
e = e
f = f
g = g
h = h
i = i
j = j
k = k
l = l
m = m
n = n
o = o
p = p
q = q
r = r
s = s
t = t
u = u
v = v
w = w
x = x
y = y
z = z
shift = layer(br_shift)
altgr = layer(br_altgr)
[br_shift:S]
, = <
- = _
. = >
/ = :
1 = !
2 = @
3 = #
4 = $
5 = %
7 = &
8 = *
9 = (
; = Ç
= = +
\ = }
] = {
a = A
b = B
c = C
d = D
e = E
f = F
g = G
h = H
i = I
j = J
k = K
l = L
m = M
n = N
o = O
p = P
q = Q
r = R
s = S
t = T
u = U
v = V
w = W
x = X
y = Y
z = Z
[br_altgr:G]
' = ~
, = •
- = \
. = ·
1 = ¹
2 = ²
3 = ³
4 = £
5 = ¢
6 = ¬
7 = {
8 = [
9 = ]
= = §
[ = ´
\ = º
] = ª
a = æ
b = “
c = ©
d = ð
e = °
f = đ
g = ŋ
h = ħ
i = →
k = ĸ
l = ł
m = µ
n = ”
o = ø
p = þ
q = /
r = ®
s = ß
t = ŧ
u = ↓
v = „
w = ?
x = »
y = ←
z = «
[br_altgr+br_shift]
' = ^
, = ×
- = ¿
. = ÷
1 = ¡
2 = ½
3 = ¾
4 = ¼
5 = ⅜
6 = ¨
7 = ⅞
8 = ™
9 = ±
[ = `
\ = º
a = Æ
b =
c = ©
d = Ð
e = °
f = ª
g = Ŋ
h = Ħ
i = ı
k = &
l = Ł
m = µ
n =
o = Ø
p = Þ
q = /
r = ®
s = ẞ
t = Ŧ
u = ↑
v =
w = ?
x = >
y = ¥
z = <

View file

@ -0,0 +1,7 @@
[brai:layout]
\ = \
shift = layer(brai_shift)
[brai_shift:S]
\ = |

View file

@ -0,0 +1,183 @@
[bt:layout]
' = ཛ
, = ས
- = ༔
. = ཧ
/ = ཨ
1 = ༡
2 = ༢
3 = ༣
4 = ༤
5 = ༥
6 = ༦
7 = ༧
8 = ༨
9 = ༩
; = ཚ
= = །
[ = ཇ
\ = ཝ
] = ཉ
a = ཏ
b = ར
c = འ
d = ད
e = ག
f = ན
g = པ
h = ཕ
i = ོ
j = བ
k = མ
l = ཙ
m = ཤ
n = ལ
o = ཅ
p = ཆ
q = ཀ
r = ང
s = ཐ
t = ི
u = ེ
v = ཡ
w = ཁ
x = ཟ
y = ུ
z = ཞ
shift = layer(bt_shift)
altgr = layer(bt_altgr)
[bt_shift:S]
' = ྫ
, = ྶ
- = ཿ
. = ྷ
/ = ྸ
1 = ༄
2 = ༅
3 = ༆
4 = ཈
5 = ཰
6 = ༈
7 = ༸
8 = ༴
9 = ༼
; = ྪ
= = ༑
[ = ྗ
\ = ྭ
] = ྙ
a = ྟ
b = ྲ
c = ཱ
d = ྡ
e = ྒ
f = ྣ
g = ྤ
h = ྥ
i = ཽ
j = ྦ
k = ྨ
l = ྩ
m = ྴ
n = ླ
o = ྕ
p = ྖ
q = ྐ
r = ྔ
s = ྠ
t = ྀ
u = ཻ
v = ྱ
w = ྑ
x = ྯ
y = ྄
z = ྮ
[bt_altgr:G]
' = '
, = ,
- = -
. = .
/ = /
1 = 1
2 = 2
3 = 3
4 = 4
5 = 5
6 = 6
7 = 7
8 = 8
9 = 9
; = :
= = =
[ = [
\ = \
] = ]
a = ཊ
b = ཪ
c = ༃
d = ཌ
e = ཮
f = ཎ
g =
h =
i = ༝
j = ༷
k = ཾ
l = ༹
m = ཥ
n = ྊ
o = ༞
p = ༟
q = ྈ
r = ྃ
s = ཋ
t = ༚
u = ༜
v = ༒
w = ྉ
x = ྾
y = ༛
z = ༓
[bt_altgr+bt_shift]
' = "
, = <
- = _
. = >
/ = ?
1 = !
2 = @
3 = #
4 = $
5 = %
6 = ༁
7 = &
8 = *
9 = (
; = ;
= = +
[ = ༾
\ = ྺ
] = ༿
a = ྚ
b = ྼ
c = ྰ
d = ྜ
e = ཯
f = ྞ
g = «
h = »
i = ༗
j = ༵
m = ྵ
n = ྋ
o = ༘
p = ༙
r = ྂ
s = ྛ
v = ྻ
x = ྿
z = ༶

View file

@ -0,0 +1,110 @@
[bw:layout]
' = '
, = ,
- = -
. = .
/ = /
1 = 1
2 = 2
3 = 3
4 = 4
5 = 5
6 = 6
7 = 7
8 = 8
9 = 9
; = ;
= = =
[ = [
\ = \
] = ]
a = a
b = b
c = c
d = d
e = e
f = f
g = g
h = h
i = i
j = j
k = k
l = l
m = m
n = n
o = o
p = p
q = q
r = r
s = s
t = t
u = u
v = v
w = w
x = x
y = y
z = z
shift = layer(bw_shift)
altgr = layer(bw_altgr)
[bw_shift:S]
' = "
, = <
- = _
. = >
/ = ?
1 = !
2 = @
3 = #
4 = $
5 = %
6 = ^
7 = &
8 = *
9 = (
; = :
= = +
[ = {
\ = |
] = }
a = A
b = B
c = C
d = D
e = E
f = F
g = G
h = H
i = I
j = J
k = K
l = L
m = M
n = N
o = O
p = P
q = Q
r = R
s = S
t = T
u = U
v = V
w = W
x = X
y = Y
z = Z
[bw_altgr:G]
' = ́
- = ̄
6 = ̂
8 = ̇
9 = ̆
; = ̤
[bw_altgr+bw_shift]
' = ̈
- = ̱
8 = ̣
; = ̤

View file

@ -0,0 +1,101 @@
[by:layout]
' = э
, = б
- = -
. = ю
/ = .
1 = 1
2 = 2
3 = 3
4 = 4
5 = 5
6 = 6
7 = 7
8 = 8
9 = 9
; = ж
= = =
[ = х
\ = \
] = '
a = ф
b = і
c = с
d = в
e = у
f = а
g = п
h = р
i = ш
j = о
k = л
l = д
m = ь
n = т
o = ў
p = з
q = й
r = к
s = ы
t = е
u = г
v = м
w = ц
x = ч
y = н
z = я
shift = layer(by_shift)
altgr = layer(by_altgr)
[by_shift:S]
' = Э
, = Б
- = _
. = Ю
/ = ,
1 = !
2 = "
3 = №
4 = ;
5 = %
6 = :
7 = ?
8 = *
9 = (
; = Ж
= = +
[ = Х
\ = /
] = '
a = Ф
b = І
c = С
d = В
e = У
f = А
g = П
h = Р
i = Ш
j = О
k = Л
l = Д
m = Ь
n = Т
o = Ў
p = З
q = Й
r = К
s = Ы
t = Е
u = Г
v = М
w = Ц
x = Ч
y = Н
z = Я
[by_altgr:G]
8 = ₽
[by_altgr+by_shift]

View file

@ -0,0 +1,115 @@
[ca:layout]
, = ,
- = -
. = .
/ = é
1 = 1
2 = 2
3 = 3
4 = 4
5 = 5
6 = 6
7 = 7
8 = 8
9 = 9
; = ;
= = =
\ = <
a = a
b = b
c = c
d = d
e = e
f = f
g = g
h = h
i = i
j = j
k = k
l = l
m = m
n = n
o = o
p = p
q = q
r = r
s = s
t = t
u = u
v = v
w = w
x = x
y = y
z = z
shift = layer(ca_shift)
altgr = layer(ca_altgr)
[ca_shift:S]
, = '
- = _
. = .
/ = É
1 = !
2 = "
3 = /
4 = $
5 = %
6 = ?
7 = &
8 = *
9 = (
; = :
= = +
\ = >
a = A
b = B
c = C
d = D
e = E
f = F
g = G
h = H
i = I
j = J
k = K
l = L
m = M
n = N
o = O
p = P
q = Q
r = R
s = S
t = T
u = U
v = V
w = W
x = X
y = Y
z = Z
[ca_altgr:G]
' = {
, = ¯
- = ½
. = ­
1 = ±
2 = @
3 = £
4 = ¢
5 = ¤
6 = ¬
7 = ¦
8 = ²
9 = ³
; = ~
= = ¾
[ = [
\ = }
] = ]
m = µ
o = §
p = ¶
[ca_altgr+ca_shift]

View file

@ -0,0 +1,130 @@
[cd:layout]
' = ɔ
, = ;
- = -
. = :
/ = !
1 = &
2 = ́
3 = ̀
4 = (
5 = {
6 = }
7 = )
8 = ̂
9 = ̌
; = m
= = =
[ = ɛ
\ = "
] = *
a = q
b = b
c = c
d = d
e = e
f = f
g = g
h = h
i = i
j = j
k = k
l = l
m = ,
n = n
o = o
p = p
q = a
r = r
s = s
t = t
u = u
v = v
w = z
x = x
y = y
z = w
shift = layer(cd_shift)
altgr = layer(cd_altgr)
[cd_shift:S]
' = Ɔ
, = .
- = _
. = /
/ = '
1 = 1
2 = 2
3 = 3
4 = 4
5 = 5
6 = 6
7 = 7
8 = 8
9 = 9
; = M
= = +
[ = Ɛ
\ = \
] = ^
a = Q
b = B
c = C
d = D
e = E
f = F
g = G
h = H
i = I
j = J
k = K
l = L
m = ?
n = N
o = O
p = P
q = A
r = R
s = S
t = T
u = U
v = V
w = Z
x = X
y = Y
z = W
[cd_altgr:G]
- = %
/ =
1 = #
2 = @
3 = «
4 = [
5 = <
6 = >
7 = ]
8 = »
9 = ̍
= = ×
[ = ^
\ = |
] = $
e = œ
i = ɨ
m = ̧
n = ŋ
o = ø
q = æ
u = ʉ
[cd_altgr+cd_shift]
- = °
= = ÷
e = Œ
i = Ɨ
n = Ŋ
o = Ø
q = Æ
u = Ʉ

View file

@ -0,0 +1,174 @@
[ch:layout]
' = ä
, = ,
- = '
. = .
/ = -
1 = 1
2 = 2
3 = 3
4 = 4
5 = 5
6 = 6
7 = 7
8 = 8
9 = 9
; = ö
[ = ü
\ = $
a = a
b = b
c = c
d = d
e = e
f = f
g = g
h = h
i = i
j = j
k = k
l = l
m = m
n = n
o = o
p = p
q = q
r = r
s = s
t = t
u = u
v = v
w = w
x = x
y = z
z = y
shift = layer(ch_shift)
altgr = layer(ch_altgr)
[ch_shift:S]
' = à
, = ;
- = ?
. = :
/ = _
1 = +
2 = "
3 = *
4 = ç
5 = %
6 = &
7 = /
8 = (
9 = )
; = é
[ = è
\ = £
] = !
a = A
b = B
c = C
d = D
e = E
f = F
g = G
h = H
i = I
j = J
k = K
l = L
m = M
n = N
o = O
p = P
q = Q
r = R
s = S
t = T
u = U
v = V
w = W
x = X
y = Z
z = Y
[ch_altgr:G]
' = {
, = •
. = ·
1 = |
2 = @
3 = #
4 = ¼
5 = ½
6 = ¬
7 = |
8 = ¢
9 = ]
[ = [
\ = }
] = ]
a = æ
b = “
c = ¢
d = ð
e = €
f = đ
g = ŋ
h = ħ
i = →
k = ĸ
l = ł
m = µ
n = ”
o = œ
p = þ
q = @
r = ¶
s = ß
t = ŧ
u = ↓
v = „
w = ſ
x = »
y = ←
z = «
[ch_altgr+ch_shift]
, = ×
- = ¿
. = ÷
1 = ¡
2 = ⅛
3 = £
4 = $
5 = ⅜
6 = ⅝
7 = ⅞
8 = ™
9 = ±
a = Æ
b =
c = ©
d = Ð
e = E
f = ª
g = Ŋ
h = Ħ
i = ı
k = &
l = Ł
m = º
n =
o = Œ
p = Þ
q = Ω
r = ®
s = ẞ
t = Ŧ
u = ↑
v =
w = §
x = >
y = ¥
z = <

View file

@ -0,0 +1,95 @@
[cm:layout]
' = '
, = ,
- = -
. = .
/ = /
1 = 1
2 = 2
3 = 3
4 = 4
5 = 5
6 = 6
7 = 7
8 = 8
9 = 9
; = ;
= = =
[ = [
\ = \
] = ]
a = a
b = b
c = c
d = d
e = e
f = f
g = g
h = h
i = i
j = j
k = k
l = l
m = m
n = n
o = o
p = p
q = q
r = r
s = s
t = t
u = u
v = v
w = w
x = x
y = y
z = z
shift = layer(cm_shift)
[cm_shift:S]
' = "
, = <
- = _
. = >
/ = ?
1 = !
2 = @
3 = #
4 = $
5 = %
6 = ^
7 = &
8 = *
9 = (
; = :
= = +
[ = {
\ = |
] = }
a = A
b = B
c = C
d = D
e = E
f = F
g = G
h = H
i = I
j = J
k = K
l = L
m = M
n = N
o = O
p = P
q = Q
r = R
s = S
t = T
u = U
v = V
w = W
x = X
y = Y
z = Z

View file

@ -0,0 +1,95 @@
[cn:layout]
' = '
, = ,
- = -
. = .
/ = /
1 = 1
2 = 2
3 = 3
4 = 4
5 = 5
6 = 6
7 = 7
8 = 8
9 = 9
; = ;
= = =
[ = [
\ = \
] = ]
a = a
b = b
c = c
d = d
e = e
f = f
g = g
h = h
i = i
j = j
k = k
l = l
m = m
n = n
o = o
p = p
q = q
r = r
s = s
t = t
u = u
v = v
w = w
x = x
y = y
z = z
shift = layer(cn_shift)
[cn_shift:S]
' = "
, = <
- = _
. = >
/ = ?
1 = !
2 = @
3 = #
4 = $
5 = %
6 = ^
7 = &
8 = *
9 = (
; = :
= = +
[ = {
\ = |
] = }
a = A
b = B
c = C
d = D
e = E
f = F
g = G
h = H
i = I
j = J
k = K
l = L
m = M
n = N
o = O
p = P
q = Q
r = R
s = S
t = T
u = U
v = V
w = W
x = X
y = Y
z = Z

View file

@ -0,0 +1,35 @@
[colemak:layout]
w = w
, = ,
s = r
a = a
c = c
g = d
q = q
e = f
] = ]
d = s
/ = /
; = o
' = '
r = p
f = t
t = g
u = l
. = .
j = n
k = e
p = ;
o = y
z = z
h = h
i = u
[ = [
v = v
l = i
m = m
n = k
x = x
b = b
y = j

View file

@ -0,0 +1,172 @@
[cz:layout]
' = §
, = ,
- = =
. = .
/ = -
1 = +
2 = ě
3 = š
4 = č
5 = ř
6 = ž
7 = ý
8 = á
9 = í
; = ů
[ = ú
] = )
a = a
b = b
c = c
d = d
e = e
f = f
g = g
h = h
i = i
j = j
k = k
l = l
m = m
n = n
o = o
p = p
q = q
r = r
s = s
t = t
u = u
v = v
w = w
x = x
y = z
z = y
shift = layer(cz_shift)
altgr = layer(cz_altgr)
[cz_shift:S]
' = !
, = ?
- = %
. = :
/ = _
1 = 1
2 = 2
3 = 3
4 = 4
5 = 5
6 = 6
7 = 7
8 = 8
9 = 9
; = "
[ = /
\ = '
] = (
a = A
b = B
c = C
d = D
e = E
f = F
g = G
h = H
i = I
j = J
k = K
l = L
m = M
n = N
o = O
p = P
q = Q
r = R
s = S
t = T
u = U
v = V
w = W
x = X
y = Z
z = Y
[cz_altgr:G]
' = '
, = <
- = \
. = >
/ = *
1 = !
2 = @
3 = #
4 = $
5 = %
6 = ^
7 = &
8 = *
9 = {
; = $
[ = [
\ = \
] = ]
a = ~
b = {
c = &
d = Đ
e = €
f = [
g = ]
h = `
i = →
j = '
k = ł
l = Ł
m = ^
n = }
o = ø
p = þ
q = \
r = ¶
s = đ
t = ŧ
u = ↓
v = @
w = |
x = #
y = ←
z = °
[cz_altgr+cz_shift]
' = ß
, = ×
. = ÷
[ = ÷
\ = |
] = ×
a = Æ
b =
c = ©
d = Ð
e = E
f = ª
g = Ŋ
h = Ħ
i = ı
k = &
l = Ł
m = º
n =
o = Ø
p = Þ
q = Ω
r = ®
s = ẞ
t = Ŧ
u = ↑
v =
w = §
x = >
y = ¥
z = <

View file

@ -0,0 +1,177 @@
[de:layout]
' = ä
, = ,
- = ß
. = .
/ = -
1 = 1
2 = 2
3 = 3
4 = 4
5 = 5
6 = 6
7 = 7
8 = 8
9 = 9
; = ö
[ = ü
\ = #
] = +
a = a
b = b
c = c
d = d
e = e
f = f
g = g
h = h
i = i
j = j
k = k
l = l
m = m
n = n
o = o
p = p
q = q
r = r
s = s
t = t
u = u
v = v
w = w
x = x
y = z
z = y
shift = layer(de_shift)
altgr = layer(de_altgr)
[de_shift:S]
' = Ä
, = ;
- = ?
. = :
/ = _
1 = !
2 = "
3 = §
4 = $
5 = %
6 = &
7 = /
8 = (
9 = )
; = Ö
[ =
\ = '
] = *
a = A
b = B
c = C
d = D
e = E
f = F
g = G
h = H
i = I
j = J
k = K
l = L
m = M
n = N
o = O
p = P
q = Q
r = R
s = S
t = T
u = U
v = V
w = W
x = X
y = Z
z = Y
[de_altgr:G]
, = ·
- = \
. = …
/ =
1 = ¹
2 = ²
3 = ³
4 = ¼
5 = ½
6 = ¬
7 = {
8 = [
9 = ]
\ =
] = ~
a = æ
b = “
c = ¢
d = ð
e = €
f = đ
g = ŋ
h = ħ
i = →
k = ĸ
l = ł
m = µ
n = ”
o = ø
p = þ
q = @
r = ¶
s = ſ
t = ŧ
u = ↓
v = „
w = ſ
x = «
y = ←
z = »
[de_altgr+de_shift]
, = ×
- = ¿
. = ÷
/ = —
1 = ¡
2 = ⅛
3 = £
4 = ¤
5 = ⅜
6 = ⅝
7 = ⅞
8 = ™
9 = ±
] = ¯
a = Æ
b =
c = ©
d = Ð
e = €
f = ª
g = Ŋ
h = Ħ
i = ı
k = &
l = Ł
m = º
n =
o = Ø
p = Þ
q = Ω
r = ®
s = ẞ
t = Ŧ
u = ↑
v =
w = §
x =
y = ¥
z =

View file

@ -0,0 +1,170 @@
[dk:layout]
' = ø
, = ,
- = +
. = .
/ = -
1 = 1
2 = 2
3 = 3
4 = 4
5 = 5
6 = 6
7 = 7
8 = 8
9 = 9
; = æ
[ = å
\ = '
a = a
b = b
c = c
d = d
e = e
f = f
g = g
h = h
i = i
j = j
k = k
l = l
m = m
n = n
o = o
p = p
q = q
r = r
s = s
t = t
u = u
v = v
w = w
x = x
y = y
z = z
shift = layer(dk_shift)
altgr = layer(dk_altgr)
[dk_shift:S]
' = Ø
, = ;
- = ?
. = :
/ = _
1 = !
2 = "
3 = #
4 = ¤
5 = %
6 = &
7 = /
8 = (
9 = )
; = Æ
[ = Å
\ = *
a = A
b = B
c = C
d = D
e = E
f = F
g = G
h = H
i = I
j = J
k = K
l = L
m = M
n = N
o = O
p = P
q = Q
r = R
s = S
t = T
u = U
v = V
w = W
x = X
y = Y
z = Z
[dk_altgr:G]
- = ±
. = ·
1 = ¡
2 = @
3 = £
4 = $
5 = ½
6 = ¥
7 = {
8 = [
9 = ]
= = |
a = ª
b = “
c = ©
d = ð
e = €
f = đ
g = ŋ
h = ħ
i = →
k = ĸ
l = ł
m = µ
n = ”
o = œ
p = þ
q = @
r = ®
s = ß
t = þ
u = ↓
v = „
w = ſ
x = »
y = ←
z = «
[dk_altgr+dk_shift]
- = ¿
1 = ¹
2 = ²
3 = ³
4 = ¼
5 = ¢
6 = ⅝
7 = ÷
8 = «
9 = »
= = ¦
\ = ×
a = º
b =
c = ©
d = Ð
e = ¢
f = ª
g = Ŋ
h = Ħ
i = ı
k = &
l = Ł
m = º
n =
o = Œ
p = Þ
q = Ω
r = ®
s = ẞ
t = Þ
u = ↑
v =
w = §
x = >
y = ¥
z = <

View file

@ -0,0 +1,95 @@
[dvorak:layout]
' = -
, = w
- = [
. = v
/ = z
1 = 1
2 = 2
3 = 3
4 = 4
5 = 5
6 = 6
7 = 7
8 = 8
9 = 9
; = s
= = ]
[ = /
\ = \
] = =
a = a
b = x
c = j
d = e
e = .
f = u
g = i
h = d
i = c
j = h
k = t
l = n
m = m
n = b
o = r
p = l
q = '
r = p
s = o
t = y
u = g
v = k
w = ,
x = q
y = f
z = ;
shift = layer(dvorak_shift)
[dvorak_shift:S]
' = _
, = W
- = {
. = V
/ = Z
1 = !
2 = @
3 = #
4 = $
5 = %
6 = ^
7 = &
8 = *
9 = (
; = S
= = }
[ = ?
\ = |
] = +
a = A
b = X
c = J
d = E
e = >
f = U
g = I
h = D
i = C
j = H
k = T
l = N
m = M
n = B
o = R
p = L
q = "
r = P
s = O
t = Y
u = G
v = K
w = <
x = Q
y = F
z = :

View file

@ -0,0 +1,180 @@
[dz:layout]
' = ù
, = ;
- = )
. = :
/ = !
1 = &
2 = é
3 = "
4 = '
5 = (
6 = -
7 = è
8 = _
9 = ç
; = m
= = =
\ = *
] = $
a = q
b = b
c = c
d = d
e = e
f = f
g = g
h = h
i = i
j = j
k = k
l = l
m = ,
n = n
o = o
p = p
q = a
r = r
s = s
t = t
u = u
v = v
w = z
x = x
y = y
z = w
shift = layer(dz_shift)
altgr = layer(dz_altgr)
[dz_shift:S]
' = %
, = .
- = °
. = /
/ = §
1 = 1
2 = 2
3 = 3
4 = 4
5 = 5
6 = 6
7 = 7
8 = 8
9 = 9
; = M
= = +
\ = µ
] = £
a = Q
b = B
c = C
d = D
e = E
f = F
g = G
h = H
i = I
j = J
k = K
l = L
m = ?
n = N
o = O
p = P
q = A
r = R
s = S
t = T
u = U
v = V
w = Z
x = X
y = Y
z = W
[dz_altgr:G]
, = ×
- = ]
. = ÷
/ = ¡
2 = ~
3 = #
4 = {
5 = [
6 = |
7 = `
8 = \
9 = ^
; = ö
= = }
] = ø
a = ä
b = ↓
c = č
d = ḍ
e = €
f =
g = ǧ
h = ḥ
i = î
j = ü
k = ï
l = ŀ
m = ¿
n = ¬
o = ɛ
p = ô
q = æ
r = ṛ
s = ṣ
t = ṭ
u = û
v = ɣ
w = ẓ
x = »
y = ÿ
z = «
[dz_altgr+dz_shift]
' = Ù
, = ⋅
- = ≠
. =
/ =
2 = É
4 = —
5 =
6 =
7 = È
8 = ™
9 = Ç
; = Ö
= = ±
] = Ø
a = Ä
b = ↑
c = Č
d = Ḍ
e = ¢
f =
g = Ǧ
h = Ḥ
i = Î
j =
k = Ï
l = Ŀ
m = …
n = →
o = Ɛ
p = Ô
q = Æ
r = Ṛ
s = Ṣ
t = Ṭ
u =
v = Ɣ
w = Ẓ
x = ”
y = Ÿ
z = “

View file

@ -0,0 +1,179 @@
[ee:layout]
' = ä
, = ,
- = +
. = .
/ = -
1 = 1
2 = 2
3 = 3
4 = 4
5 = 5
6 = 6
7 = 7
8 = 8
9 = 9
; = ö
[ = ü
\ = '
] = õ
a = a
b = b
c = c
d = d
e = e
f = f
g = g
h = h
i = i
j = j
k = k
l = l
m = m
n = n
o = o
p = p
q = q
r = r
s = s
t = t
u = u
v = v
w = w
x = x
y = y
z = z
shift = layer(ee_shift)
altgr = layer(ee_altgr)
[ee_shift:S]
' = Ä
, = ;
- = ?
. = :
/ = _
1 = !
2 = "
3 = #
4 = ¤
5 = %
6 = &
7 = /
8 = (
9 = )
; = Ö
[ =
\ = *
] = Õ
a = A
b = B
c = C
d = D
e = E
f = F
g = G
h = H
i = I
j = J
k = K
l = L
m = M
n = N
o = O
p = P
q = Q
r = R
s = S
t = T
u = U
v = V
w = W
x = X
y = Y
z = Z
[ee_altgr:G]
' = ^
, = <
- = \
. = >
/ = |
1 = ¹
2 = @
3 = £
4 = $
5 = ½
6 = ¬
7 = {
8 = [
9 = ]
= = `
\ = ½
] = §
a = æ
b = “
c = ¢
d = ð
e = €
f = đ
g = ŋ
h = ħ
i = →
k = ĸ
l = ł
m = µ
n = ”
o = ø
p = þ
q = @
r = ¶
s = š
t = ŧ
u = ↓
v = „
w = ſ
x = »
y = ←
z = ž
[ee_altgr+ee_shift]
, = ×
- = ¿
. = ÷
/ = ˙
1 = ¡
2 = ⅛
3 = £
4 = $
5 = ⅜
6 = ⅝
7 = ⅞
8 = ™
9 = ±
= = '
a = Æ
b =
c = ©
d = Ð
e = ¢
f = ª
g = Ŋ
h = Ħ
i = ı
k = &
l = Ł
m = º
n =
o = Ø
p = Þ
q = Ω
r = ®
s = Š
t = Ŧ
u = ↑
v =
w = §
x = >
y = ¥
z = Ž

View file

@ -0,0 +1,126 @@
[epo:layout]
' = '
, = ,
- = -
. = .
/ = /
1 = 1
2 = 2
3 = 3
4 = 4
5 = 5
6 = 6
7 = 7
8 = 8
9 = 9
; = ;
= = =
[ = ĵ
\ = \
] = ĥ
a = a
b = b
c = c
d = d
e = e
f = f
g = g
h = h
i = i
j = j
k = k
l = l
m = m
n = n
o = o
p = p
q = ŝ
r = r
s = s
t = t
u = u
v = v
w = ĝ
x = ĉ
y = ŭ
z = z
shift = layer(epo_shift)
altgr = layer(epo_altgr)
[epo_shift:S]
' = "
, = <
- = _
. = >
/ = ?
1 = !
2 = @
3 = #
4 = $
5 = %
6 = ^
7 = &
8 = *
9 = (
; = :
= = +
[ = Ĵ
\ = |
] = Ĥ
a = A
b = B
c = C
d = D
e = E
f = F
g = G
h = H
i = I
j = J
k = K
l = L
m = M
n = N
o = O
p = P
q = Ŝ
r = R
s = S
t = T
u = U
v = V
w = Ĝ
x = Ĉ
y =
z = Z
[epo_altgr:G]
5 = €
[ = [
] = ]
a =
d = “
f = ”
m = —
n =
o = {
p = }
q = q
s =
w = w
x = x
y = y
[epo_altgr+epo_shift]
5 = €
[ = {
] = }
m = —
n =
o = {
p = }
q = Q
w = W
x = X
y = Y

View file

@ -0,0 +1,174 @@
[es:layout]
, = ,
- = '
. = .
/ = -
1 = 1
2 = 2
3 = 3
4 = 4
5 = 5
6 = 6
7 = 7
8 = 8
9 = 9
; = ñ
= = ¡
\ = ç
] = +
a = a
b = b
c = c
d = d
e = e
f = f
g = g
h = h
i = i
j = j
k = k
l = l
m = m
n = n
o = o
p = p
q = q
r = r
s = s
t = t
u = u
v = v
w = w
x = x
y = y
z = z
shift = layer(es_shift)
altgr = layer(es_altgr)
[es_shift:S]
, = ;
- = ?
. = :
/ = _
1 = !
2 = "
3 = ·
4 = $
5 = %
6 = &
7 = /
8 = (
9 = )
; = Ñ
= = ¿
\ = Ç
] = *
a = A
b = B
c = C
d = D
e = E
f = F
g = G
h = H
i = I
j = J
k = K
l = L
m = M
n = N
o = O
p = P
q = Q
r = R
s = S
t = T
u = U
v = V
w = W
x = X
y = Y
z = Z
[es_altgr:G]
' = {
, = •
- = \
. = ·
1 = |
2 = @
3 = #
4 = ~
5 = ½
6 = ¬
7 = {
8 = [
9 = ]
[ = [
\ = }
] = ]
a = æ
b = “
c = ¢
d = ð
e = €
f = đ
g = ŋ
h = ħ
i = →
k = ĸ
l = ł
m = µ
n = ”
o = ø
p = þ
q = @
r = ¶
s = ß
t = ŧ
u = ↓
v = „
w = ſ
x = »
y = ←
z = «
[es_altgr+es_shift]
, = ×
- = ¿
. = ÷
1 = ¡
2 = ⅛
3 = £
4 = $
5 = ⅜
6 = ⅝
7 = ⅞
8 = ™
9 = ±
a = Æ
b =
c = ©
d = Ð
e = ¢
f = ª
g = Ŋ
h = Ħ
i = ı
k = &
l = Ł
m = º
n =
o = Ø
p = Þ
q = Ω
r = ®
s = ẞ
t = Ŧ
u = ↑
v =
w = §
x = >
y = ¥
z = <

View file

@ -0,0 +1,84 @@
[et:layout]
' = ፦
, = ፣
- = -
. = ፤
/ = ፧
1 = ፩
2 = ፪
3 = ፫
4 = ፬
5 = ፭
6 = ፮
7 = ፯
8 = ፰
9 = ፱
; = ።
= = =
[ = ፀ
] = ጨ
a = ﹧
b = በ
c = ቸ
d = ደ
e = ﹩
f = ፈ
g = ገ
h =
i = ﹱ
j = ጀ
k = ከ
l = ለ
m = መ
n = ነ
o = ﹳ
p = ፐ
q = ቀ
r = ረ
s = ሰ
t = ተ
u = ﹵
v = ሸ
w = ወ
x = አ
y = የ
z = ዘ
shift = layer(et_shift)
[et_shift:S]
' = ፥
- = _
/ = ?
1 = ፲
2 = ፳
3 = ፴
4 = ፵
5 = ፶
6 = ፷
7 = ፸
8 = ፹
9 = ፺
; = ፡
= = +
[ = ጸ
\ =
] = ኀ
a =
c = ﹸ
d = ዸ
e = ﹰ
g = ጘ
h = ሐ
i = ﹲ
k = ኸ
n = ኘ
o = ﹴ
p = ጰ
q = ቐ
s = ሠ
t = ጠ
u = ﹶ
v = ቨ
x =
z = ዠ

View file

@ -0,0 +1,167 @@
[fi:layout]
' = ä
, = ,
- = +
. = .
/ = -
1 = 1
2 = 2
3 = 3
4 = 4
5 = 5
6 = 6
7 = 7
8 = 8
9 = 9
; = ö
[ = å
\ = '
a = a
b = b
c = c
d = d
e = e
f = f
g = g
h = h
i = i
j = j
k = k
l = l
m = m
n = n
o = o
p = p
q = q
r = r
s = s
t = t
u = u
v = v
w = w
x = x
y = y
z = z
shift = layer(fi_shift)
altgr = layer(fi_altgr)
[fi_shift:S]
' = Ä
, = ;
- = ?
. = :
/ = _
1 = !
2 = "
3 = #
4 = ¤
5 = %
6 = &
7 = /
8 = (
9 = )
; = Ö
[ = Å
\ = *
a = A
b = B
c = C
d = D
e = E
f = F
g = G
h = H
i = I
j = J
k = K
l = L
m = M
n = N
o = O
p = P
q = Q
r = R
s = S
t = T
u = U
v = V
w = W
x = X
y = Y
z = Z
[fi_altgr:G]
' = æ
, =
- = \
/ =
2 = @
3 = £
4 = $
5 = ‰
6 =
7 = {
8 = [
9 = ]
; = ø
a = ə
b = b
c = c
d = ð
e = €
f = f
g = g
h = h
i = ı
j = j
k = ĸ
m = µ
n = ŋ
o = œ
q = q
r = r
s = ß
t = þ
u = u
v = v
w = w
x = ×
y = y
z = ʒ
[fi_altgr+fi_shift]
' = Æ
, =
- = ¿
1 = ¡
2 = ”
3 = »
4 = «
5 = “
6 = „
8 = <
9 = >
; = Ø
a = Ə
b = B
c = C
d = Ð
f = F
g = G
h = H
i = |
j = J
m = —
n = Ŋ
o = Œ
q = Q
r = R
s = ẞ
t = Þ
u = U
v = V
w = W
x = ·
y = Y
z = Ʒ

View file

@ -0,0 +1,174 @@
[fo:layout]
' = ø
, = ,
- = +
. = .
/ = -
1 = 1
2 = 2
3 = 3
4 = 4
5 = 5
6 = 6
7 = 7
8 = 8
9 = 9
; = æ
[ = å
\ = '
] = ð
a = a
b = b
c = c
d = d
e = e
f = f
g = g
h = h
i = i
j = j
k = k
l = l
m = m
n = n
o = o
p = p
q = q
r = r
s = s
t = t
u = u
v = v
w = w
x = x
y = y
z = z
shift = layer(fo_shift)
altgr = layer(fo_altgr)
[fo_shift:S]
' = Ø
, = ;
- = ?
. = :
/ = _
1 = !
2 = "
3 = #
4 = ¤
5 = %
6 = &
7 = /
8 = (
9 = )
; = Æ
[ = Å
\ = *
] = Ð
a = A
b = B
c = C
d = D
e = E
f = F
g = G
h = H
i = I
j = J
k = K
l = L
m = M
n = N
o = O
p = P
q = Q
r = R
s = S
t = T
u = U
v = V
w = W
x = X
y = Y
z = Z
[fo_altgr:G]
- = ±
. = ·
/ = ­
1 = ¡
2 = @
3 = £
4 = $
5 = ½
6 = ¥
7 = {
8 = [
9 = ]
= = |
a = ª
b = “
c = ©
d = ð
e = €
f = đ
g = ŋ
h = ħ
i = →
k = ĸ
l = ł
m = µ
n = ”
o = œ
p = þ
q = @
r = ®
s = ß
t = þ
u = ↓
v = „
w = ſ
x = »
y = ←
z = «
[fo_altgr+fo_shift]
- = ¿
/ = ¯
1 = ¹
2 = ²
3 = ³
4 = ¼
5 = ¢
6 = ⅝
7 = ÷
8 = «
9 = »
= = ¦
\ = ×
a = º
b =
c = ©
d = Ð
e = ¢
f = ª
g = Ŋ
h = Ħ
i = ı
k = &
l = Ł
m = º
n =
o = Œ
p = Þ
q = Ω
r = ®
s = ẞ
t = Þ
u = ↑
v =
w = §
x = >
y = ¥
z = <

View file

@ -0,0 +1,177 @@
[fr:layout]
' = ù
, = ;
- = )
. = :
/ = !
1 = &
2 = é
3 = "
4 = '
5 = (
6 = -
7 = è
8 = _
9 = ç
0 = à
; = m
= = =
\ = *
] = $
a = q
b = b
c = c
d = d
e = e
f = f
g = g
h = h
i = i
j = j
k = k
l = l
m = ,
n = n
o = o
p = p
q = a
r = r
s = s
t = t
u = u
v = v
w = z
x = x
y = y
z = w
shift = layer(fr_shift)
altgr = layer(fr_altgr)
[fr_shift:S]
' = %
, = .
- = °
. = /
/ = §
1 = 1
2 = 2
3 = 3
4 = 4
5 = 5
6 = 6
7 = 7
8 = 8
9 = 9
0 = 0
; = M
= = +
\ = µ
] = £
a = Q
b = B
c = C
d = D
e = E
f = F
g = G
h = H
i = I
j = J
k = K
l = L
m = ?
n = N
o = O
p = P
q = A
r = R
s = S
t = T
u = U
v = V
w = Z
x = X
y = Y
z = W
[fr_altgr:G]
, = •
- = ]
. = ·
1 = ¹
2 = ~
3 = #
4 = {
5 = [
6 = |
7 = `
8 = \
9 = ^
0 = @
; = µ
= = }
] = ¤
a = @
b = “
c = ¢
d = ð
e = €
f = đ
g = ŋ
h = ħ
i = →
k = ĸ
l = ł
n = ”
o = ø
p = þ
q = æ
r = ¶
s = ß
t = ŧ
u = ↓
v = „
w = «
x = »
y = ←
z = ł
[fr_altgr+fr_shift]
, = ×
- = ¿
. = ÷
1 = ¡
2 = ⅛
3 = £
4 = $
5 = ⅜
6 = ⅝
7 = ⅞
8 = ™
9 = ±
; = º
a = Ω
b =
c = ©
d = Ð
e = ¢
f = ª
g = Ŋ
h = Ħ
i = ı
k = &
l = Ł
n =
o = Ø
p = Þ
q = Æ
r = ®
s = ẞ
t = Ŧ
u = ↑
v =
w = <
x = >
y = ¥
z = Ł

View file

@ -0,0 +1,174 @@
[gb:layout]
' = '
, = ,
- = -
. = .
/ = /
1 = 1
2 = 2
3 = 3
4 = 4
5 = 5
6 = 6
7 = 7
8 = 8
9 = 9
; = ;
= = =
[ = [
\ = #
] = ]
a = a
b = b
c = c
d = d
e = e
f = f
g = g
h = h
i = i
j = j
k = k
l = l
m = m
n = n
o = o
p = p
q = q
r = r
s = s
t = t
u = u
v = v
w = w
x = x
y = y
z = z
shift = layer(gb_shift)
altgr = layer(gb_altgr)
[gb_shift:S]
' = @
, = <
- = _
. = >
/ = ?
1 = !
2 = "
3 = £
4 = $
5 = %
6 = ^
7 = &
8 = *
9 = (
; = :
= = +
[ = {
\ = ~
] = }
a = A
b = B
c = C
d = D
e = E
f = F
g = G
h = H
i = I
j = J
k = K
l = L
m = M
n = N
o = O
p = P
q = Q
r = R
s = S
t = T
u = U
v = V
w = W
x = X
y = Y
z = Z
[gb_altgr:G]
, = •
- = \
. = ·
1 = ¹
2 = ²
3 = ³
4 = €
5 = ½
6 = ¾
7 = {
8 = [
9 = ]
a = æ
b = “
c = ¢
d = ð
e = e
f = đ
g = ŋ
h = ħ
i = →
k = ĸ
l = ł
m = µ
n = ”
o = ø
p = þ
q = @
r = ¶
s = ß
t = ŧ
u = ↓
v = „
w = ſ
x = »
y = ←
z = «
[gb_altgr+gb_shift]
, = ×
- = ¿
. = ÷
1 = ¡
2 = ⅛
3 = £
4 = ¼
5 = ⅜
6 = ⅝
7 = ⅞
8 = ™
9 = ±
a = Æ
b =
c = ©
d = Ð
e = E
f = ª
g = Ŋ
h = Ħ
i = ı
k = &
l = Ł
m = º
n =
o = Ø
p = Þ
q = Ω
r = ®
s = ẞ
t = Ŧ
u = ↑
v =
w = §
x = >
y = ¥
z = <

View file

@ -0,0 +1,125 @@
[ge:layout]
' = '
, = ,
- = -
. = .
/ = /
1 = 1
2 = 2
3 = 3
4 = 4
5 = 5
6 = 6
7 = 7
8 = 8
9 = 9
; = ;
= = =
[ = [
\ = \
] = ]
a = ა
b = ბ
c = ც
d = დ
e = ე
f = ფ
g = გ
h = ჰ
i = ი
j = ჯ
k = კ
l = ლ
m = მ
n = ნ
o = ო
p = პ
q = ქ
r = რ
s = ს
t = ტ
u = უ
v = ვ
w = წ
x = ხ
y =
z = ზ
shift = layer(ge_shift)
altgr = layer(ge_altgr)
[ge_shift:S]
' = "
, = <
- = _
. = >
/ = ?
1 = !
2 = @
3 = #
4 = $
5 = %
6 = ^
7 = &
8 = *
9 = (
; = :
= = +
[ = {
\ = |
] = }
a = A
b = B
c = ჩ
d = D
e = E
f = F
g = G
h = H
i = I
j = ჟ
k = K
l = L
m = M
n = N
o = O
p = P
q = Q
r = ღ
s = შ
t = თ
u = U
v = V
w = ჭ
x = X
y = Y
z = ძ
[ge_altgr:G]
, = «
- = —
. = »
/ = ჻
1 = '
2 = „
3 = “
4 = №
5 = €
7 = §
8 = °
= =
\ = ~
a = ჺ
e = ჱ
f = ჶ
g = ჹ
h = ჵ
i = ჲ
j = ჷ
n = ჼ
v = ჳ
x = ჴ
y = ჸ
[ge_altgr+ge_shift]
\ = ~

View file

@ -0,0 +1,102 @@
[gh:layout]
' = '
, = ,
- = -
. = .
/ = /
1 = 1
2 = 2
3 = 3
4 = 4
5 = 5
6 = 6
7 = 7
8 = 8
9 = 9
; = ;
= = =
[ = [
\ = \
] = ]
a = a
b = b
c = c
d = d
e = e
f = f
g = g
h = h
i = i
j = j
k = k
l = l
m = m
n = n
o = o
p = p
q = q
r = r
s = s
t = t
u = u
v = v
w = w
x = x
y = y
z = z
shift = layer(gh_shift)
altgr = layer(gh_altgr)
[gh_shift:S]
' = "
, = <
- = _
. = >
/ = ?
1 = !
2 = @
3 = #
4 = ₵
5 = %
6 = ^
7 = &
8 = *
9 = (
; = :
= = +
[ = {
\ = |
] = }
a = A
b = B
c = C
d = D
e = E
f = F
g = G
h = H
i = I
j = J
k = K
l = L
m = M
n = N
o = O
p = P
q = Q
r = R
s = S
t = T
u = U
v = V
w = W
x = X
y = Y
z = Z
[gh_altgr:G]
4 = $
[gh_altgr+gh_shift]
4 = ¢

View file

@ -0,0 +1,94 @@
[gn:layout]
' = ߯
, = ؛
- = )
. = ،
/ = ߹
1 = ߱
2 = ߫
3 = ߵ
4 = ߴ
5 = (
6 = -
7 = ߬
8 = ߺ
9 = ߭
; = ߡ
= = =
[ = ߳
\ = ߑ
] = $
a = ߫
b = ߓ
c = ߗ
d = ߘ
e = ߍ
f = ߝ
g = ߜ
h = ߤ
i = ߌ
j = ߖ
k = ߞ
l = ߟ
m = ߸
n = ߣ
o = ߐ
p = ߔ
q = ߊ
r = ߙ
s = ߛ
t = ߕ
u = ߎ
v = ߢ
w = ߠ
x = ،
y = ߦ
z = ߥ
shift = layer(gn_shift)
altgr = layer(gn_altgr)
[gn_shift:S]
' = ߸
. = /
1 = ߁
2 = ߂
3 = ߃
4 = ߄
5 = ߅
6 = ߆
7 = ߇
8 = ߈
9 = ߉
= = +
\ = *
] = £
c = ߩ
e = ߋ
g = ߷
j = ߨ
l = ߪ
m = ؟
n = ߒ
o = ߏ
r = ߚ
u = ߶
w = <
y = ߧ
[gn_altgr:G]
' = %
3 = #
4 = ⸜
5 = ⸝
6 = |
7 = `
8 = \
9 = ^
= = }
] = ¤
[gn_altgr+gn_shift]
3 = £
4 = $
9 = ±

View file

@ -0,0 +1,150 @@
[gr:layout]
' = '
, = ,
- = -
. = .
/ = /
1 = 1
2 = 2
3 = 3
4 = 4
5 = 5
6 = 6
7 = 7
8 = 8
9 = 9
= = =
[ = [
\ = \
] = ]
a = α
b = β
c = ψ
d = δ
e = ε
f = φ
g = γ
h = η
i = ι
j = ξ
k = κ
l = λ
m = μ
n = ν
o = ο
p = π
q = ;
r = ρ
s = σ
t = τ
u = θ
v = ω
w = ς
x = χ
y = υ
z = ζ
shift = layer(gr_shift)
altgr = layer(gr_altgr)
[gr_shift:S]
' = "
, = <
- = _
. = >
/ = ?
1 = !
2 = @
3 = #
4 = $
5 = %
6 = ^
7 = &
8 = *
9 = (
= = +
[ = {
\ = |
] = }
a = Α
b = Β
c = Ψ
d = Δ
e = Ε
f = Φ
g = Γ
h = Η
i = Ι
j = Ξ
k = Κ
l = Λ
m = Μ
n = Ν
o = Ο
p = Π
q = :
r = Ρ
s = Σ
t = Τ
u = Θ
v = Ω
w = Σ
x = Χ
y = Υ
z = Ζ
[gr_altgr:G]
, = «
- = ±
. = »
2 = ½
3 = £
4 = ¼
5 = €
6 = ϰ
7 = ϗ
8 = ₯
b = ϐ
c = ©
d = ↓
e = €
f = ϕ
g = ϝ
i = ͻ
j = ͼ
k = ϟ
l = ϲ
m = ϻ
n = ʹ
p = ϡ
q = ·
r = ®
u = ϑ
v = ϖ
w = ϛ
x = →
y = ϒ
z = ͽ
[gr_altgr+gr_shift]
. = ·
1 = ¹
2 = ²
3 = ³
4 = ¾
7 = Ϗ
d = ↑
g = Ϝ
i = Ͻ
j = Ͼ
k = Ϟ
l = Ϲ
m = Ϻ
n = ͵
p = Ϡ
r = ϱ
u = ϴ
w = Ϛ
x = ←
y = ϒ
z = Ͽ

View file

@ -0,0 +1,65 @@
[graphite:layout]
q = b
w = l
e = d
r = w
t = z
y = '
u = f
i = o
o = u
p = j
[ = ;
] = =
a = n
s = r
d = t
f = s
h = y
j = h
k = a
l = e
; = i
' = ,
z = q
c = m
v = c
b = v
n = k
m = p
, = .
. = -
shift = layer(graphite_shift)
[graphite_shift:S]
b = B
l = L
d = D
w = W
z = Z
' = _
f = F
o = O
u = U
j = J
; = :
= = +
n = N
r = R
t = T
s = S
y = Y
h = H
a = A
e = E
i = I
, = ?
x = X
m = M
c = C
v = V
q = Q
k = K
. = >
- = "
/ = <

View file

@ -0,0 +1,64 @@
[graphite-angle-kp:layout]
q = b
w = l
e = d
r = w
t = z
y = '
u = f
i = o
o = u
p = j
[ = ;
] = =
a = n
s = r
d = t
f = s
h = y
j = h
k = a
l = e
; = i
' = ,
z = x
x = m
b = q
n = k
m = p
, = .
. = -
shift = layer(graphite-angle-kp_shift)
[graphite-angle-kp_shift:S]
b = B
l = L
d = D
w = W
z = Z
y = _
f = F
o = O
u = U
j = J
; = :
= = +
n = N
r = R
t = T
s = S
y = Y
h = H
a = A
e = E
i = I
, = ?
x = X
m = M
c = C
v = V
q = Q
k = K
. = >
- = "
/ = <

View file

@ -0,0 +1,169 @@
[hr:layout]
' = ć
, = ,
- = '
. = .
/ = -
1 = 1
2 = 2
3 = 3
4 = 4
5 = 5
6 = 6
7 = 7
8 = 8
9 = 9
; = č
= = +
[ = š
\ = ž
] = đ
a = a
b = b
c = c
d = d
e = e
f = f
g = g
h = h
i = i
j = j
k = k
l = l
m = m
n = n
o = o
p = p
q = q
r = r
s = s
t = t
u = u
v = v
w = w
x = x
y = z
z = y
shift = layer(hr_shift)
altgr = layer(hr_altgr)
[hr_shift:S]
' = Ć
, = ;
- = ?
. = :
/ = _
1 = !
2 = "
3 = #
4 = $
5 = %
6 = &
7 = /
8 = (
9 = )
; = Č
= = *
[ = Š
\ = Ž
] = Đ
a = A
b = B
c = C
d = D
e = E
f = F
g = G
h = H
i = I
j = J
k = K
l = L
m = M
n = N
o = O
p = P
q = Q
r = R
s = S
t = T
u = U
v = V
w = W
x = X
y = Z
z = Y
[hr_altgr:G]
' = ß
, = <
. = >
1 = ~
3 = ^
5 = °
7 = `
[ = ÷
\ = ¤
] = ×
a = æ
b = {
c = ¢
d = ”
e = €
f = [
g = ]
h = ħ
i = →
k = ł
l = ł
m = §
n = }
o = ø
p = þ
q = \
r = ¶
s = „
t = ŧ
u = ↓
v = @
w = |
x =
y = ←
z =
[hr_altgr+hr_shift]
, = ×
- = ¨
. = ÷
2 = ˇ
4 = ˘
6 = ˛
8 = ˙
9 = '
= = ¸
a = Æ
b = '
c = ©
d = «
e = €
f = ª
g = Ŋ
h = Ħ
i = ı
k = &
l = Ł
m = º
n = }
o = Ø
p = Þ
q = Ω
r = ®
s = »
t = Ŧ
u = ↑
v = `
w = Ł
x = «
y = ¥
z = »

View file

@ -0,0 +1,175 @@
[hu:layout]
' = á
, = ,
- = ü
. = .
/ = -
1 = 1
2 = 2
3 = 3
4 = 4
5 = 5
6 = 6
7 = 7
8 = 8
9 = 9
; = é
= = ó
[ = ő
\ = ű
] = ú
a = a
b = b
c = c
d = d
e = e
f = f
g = g
h = h
i = i
j = j
k = k
l = l
m = m
n = n
o = o
p = p
q = q
r = r
s = s
t = t
u = u
v = v
w = w
x = x
y = z
z = y
shift = layer(hu_shift)
altgr = layer(hu_altgr)
[hu_shift:S]
' = Á
, = ?
- =
. = :
/ = _
1 = '
2 = "
3 = +
4 = !
5 = %
6 = /
7 = =
8 = (
9 = )
; = É
= = Ó
[ = Ő
\ =
] = ¬
a = A
b = B
c = C
d = D
e = E
f = F
g = G
h = H
i = I
j = J
k = K
l = L
m = M
n = N
o = O
p = P
q = Q
r = R
s = S
t = T
u = U
v = V
w = W
x = X
y = Z
z = Y
[hu_altgr:G]
' = ß
, = ;
. = >
/ = *
1 = ~
3 = ^
7 = `
; = $
[ = ÷
\ = ¤
] = ×
a = ä
b = {
c = &
d = Đ
e = Ä
f = [
g = ]
h = ħ
i = Í
j = í
k = ł
l = Ł
m = <
n = }
o = „
p = ”
q = \
r = ¶
s = đ
t = ŧ
u = €
v = @
w = |
x = #
y =
z = >
[hu_altgr+hu_shift]
' = ẞ
, = ×
- = ¨
. = ÷
2 = ˇ
4 = ˘
5 = °
6 = ˛
8 = ˙
9 = ´
; = ¢
= = ¸
a = Ä
b =
c = ©
d = Ð
e = E
f = ª
g = Ŋ
h = Ħ
i = í
j = Í
k = &
l = Ł
m = º
n =
o = Ø
p = Þ
q = Ω
r = ®
s = ẞ
t = Ŧ
u = ↑
v =
w = §
x = >
y = ¥
z = <

View file

@ -0,0 +1,95 @@
[id:layout]
' = '
, = ,
- = -
. = .
/ = /
1 = 1
2 = 2
3 = 3
4 = 4
5 = 5
6 = 6
7 = 7
8 = 8
9 = 9
; = ;
= = =
[ = [
\ = \
] = ]
a = a
b = b
c = c
d = d
e = e
f = f
g = g
h = h
i = i
j = j
k = k
l = l
m = m
n = n
o = o
p = p
q = q
r = r
s = s
t = t
u = u
v = v
w = w
x = x
y = y
z = z
shift = layer(id_shift)
[id_shift:S]
' = "
, = <
- = _
. = >
/ = ?
1 = !
2 = @
3 = #
4 = $
5 = %
6 = ^
7 = &
8 = *
9 = (
; = :
= = +
[ = {
\ = |
] = }
a = A
b = B
c = C
d = D
e = E
f = F
g = G
h = H
i = I
j = J
k = K
l = L
m = M
n = N
o = O
p = P
q = Q
r = R
s = S
t = T
u = U
v = V
w = W
x = X
y = Y
z = Z

View file

@ -0,0 +1,173 @@
[ie:layout]
' = '
, = ,
- = -
. = .
/ = /
1 = 1
2 = 2
3 = 3
4 = 4
5 = 5
6 = 6
7 = 7
8 = 8
9 = 9
; = ;
= = =
[ = [
\ = #
] = ]
a = a
b = b
c = c
d = d
e = e
f = f
g = g
h = h
i = i
j = j
k = k
l = l
m = m
n = n
o = o
p = p
q = q
r = r
s = s
t = t
u = u
v = v
w = w
x = x
y = y
z = z
shift = layer(ie_shift)
altgr = layer(ie_altgr)
[ie_shift:S]
' = @
, = <
- = _
. = >
/ = ?
1 = !
2 = "
3 = £
4 = $
5 = %
6 = ^
7 = &
8 = *
9 = (
; = :
= = +
[ = {
\ = ~
] = }
a = A
b = B
c = C
d = D
e = E
f = F
g = G
h = H
i = I
j = J
k = K
l = L
m = M
n = N
o = O
p = P
q = Q
r = R
s = S
t = T
u = U
v = V
w = W
x = X
y = Y
z = Z
[ie_altgr:G]
' = æ
, = ≤
- =
. = ≥
/ = ÷
1 = ¡
2 = ™
3 = ©
4 = €
5 = §
7 = ¶
9 = ª
; = …
= = ≠
[ = “
\ = «
] =
a = á
b = ¨
d = ð
e = é
f = ƒ
g = ©
i = í
j = ı
l = ´
m = ¯
o = ó
p =
q = œ
r = ®
s = ß
t = þ
u = ú
x = ×
y = ¥
z = 〈
[ie_altgr+ie_shift]
' = Æ
, = „
- = —
. =
/ = ¿
1 = ¹
2 = ²
3 = ³
4 = ¢
5 = †
6 = ‰
7 = ⁊
8 = •
9 = ·
; = ‡
= = ±
[ = ”
\ = »
] =
a = Á
c = ¸
d = Ð
e = É
i = Í
j = ¼
k = ½
l = ¾
o = Ó
q = Œ
r = ‰
s = ẞ
t = Þ
u = ¬
x =
y = µ
z = 〉

View file

@ -0,0 +1,134 @@
[il:layout]
' = ,
, = ת
- = -
. = ץ
/ = .
1 = 1
2 = 2
3 = 3
4 = 4
5 = 5
6 = 6
7 = 7
8 = 8
9 = 9
; = ף
= = =
[ = ]
\ = \
] = [
a = ש
b = נ
c = ב
d = ג
e = ק
f = כ
g = ע
h = י
i = ן
j = ח
k = ל
l = ך
m = צ
n = מ
o = ם
p = פ
q = /
r = ר
s = ד
t = א
u = ו
v = ה
w = '
x = ס
y = ט
z = ז
shift = layer(il_shift)
altgr = layer(il_altgr)
[il_shift:S]
' = "
, = >
- = _
. = <
/ = ?
1 = !
2 = @
3 = #
4 = $
5 = %
6 = ^
7 = &
8 = *
9 = )
; = :
= = +
[ = }
\ = |
] = {
a = A
b = B
c = C
d = D
e = E
f = F
g = G
h = H
i = I
j = J
k = K
l = L
m = M
n = N
o = O
p = P
q = Q
r = R
s = S
t = T
u = U
v = V
w = W
x = X
y = Y
z = Z
[il_altgr:G]
' = ״
, =
- = ־
. =
/ = ÷
3 = €
4 = ₪
5 = °
6 = ֫
7 = ֽ
8 = ×
9 =
; = „
= =
[ = ֲ
\ = ֻ
] = ֿ
a = ְ
c = ֱ
e = ָ
g = ױ
h = ײ
j = ִ
l = ”
m = ֵ
p = ַ
q = ׂ
r = ֳ
s = ּ
u = ֹ
w = ׁ
x = ֶ
y = װ
[il_altgr+il_shift]
b = ׆

View file

@ -0,0 +1,145 @@
[in:layout]
' = ट
, = ,
- = -
. = .
/ = य
1 = १
2 = २
3 = ३
4 = ४
5 = ५
6 = ६
7 = ७
8 = ८
9 = ९
; = च
= = ृ
[ = ड
\ = ॉ
] = ़
a = ो
b = व
c = म
d = ्
e = ा
f = ि
g = ु
h = प
i = ग
j = र
k = क
l = त
m = स
n = ल
o = द
p = ज
q = ौ
r = ी
s = े
t = ू
u = ह
v = न
w = ै
x = ं
y = ब
z = ॆ
shift = layer(in_shift)
altgr = layer(in_altgr)
[in_shift:S]
' = ठ
, = ष
- =
. = ।
/ = य़
1 = ऍ
2 = ॅ
3 = #
4 = $
5 = %
6 = ^
7 = &
8 = *
9 = (
; = छ
= = ऋ
[ = ढ
\ = ऑ
] = ञ
a = ओ
b = ऴ
c = ण
d = अ
e = आ
f = इ
g = उ
h = फ
i = घ
j = ऱ
k = ख
l = थ
m = श
n = ळ
o = ध
p = झ
q = औ
r = ई
s = ए
t = ऊ
u = ङ
v = ऩ
w = ऐ
x = ँ
y = भ
z = ऎ
[in_altgr:G]
, = ॰
- = -
. = ॥
/ = /
1 = 1
2 = 2
3 = 3
4 = 4
5 = 5
6 = 6
7 = 7
8 = 8
9 = 9
; = ॒
= = ॄ
[ = ड़
\ = \
c = ॔
f = ॢ
i = ग़
k = क़
p = ज़
r = ॣ
z = ॓
[in_altgr+in_shift]
' = ॑
- = _
. = ऽ
/ = ?
1 = !
2 = @
3 = #
4 = ₹
5 = %
6 = ^
7 = &
8 = *
9 = (
= = ॠ
[ = ढ़
\ = |
f = ऌ
h = फ़
k = ख़
r = ॡ
x = ॐ

View file

@ -0,0 +1,143 @@
[iq:layout]
' = ط
, = و
- = -
. = ز
/ = ظ
1 = 1
2 = 2
3 = 3
4 = 4
5 = 5
6 = 6
7 = 7
8 = 8
9 = 9
; = ك
= = =
[ = ج
\ = \
] = د
a = ش
b = ﻻ
c = ؤ
d = ي
e = ث
f = ب
g = ل
h = ا
i = ه
j = ت
k = ن
l = م
m = ة
n = ى
o = خ
p = ح
q = ض
r = ق
s = س
t = ف
u = ع
v = ر
w = ص
x = ء
y = غ
z = ئ
shift = layer(iq_shift)
altgr = layer(iq_altgr)
[iq_shift:S]
' = "
, = ,
- = _
. = .
/ = ؟
1 = !
2 = @
3 = #
4 = $
5 = %
6 = ^
7 = &
8 = *
9 = )
; = :
= = +
[ = <
\ = …
] = >
a = ِ
b = ﻵ
c = }
d = ]
e = ُ
f = [
g = ﻷ
h = أ
i = ÷
j = ـ
k = ،
l = /
m = '
n = آ
o = ×
p = ؛
q = َ
r = ٌ
s = ٍ
t = ﻹ
u = `
v = {
w = ً
x = ْ
y = إ
z = ~
[iq_altgr:G]
' = ⟩
, = ٬
- =
. = ژ
/ = ٭
1 = ١
2 = ٢
3 = ٣
4 = ٤
5 = ٥
6 = ٦
7 = ٧
8 = ٨
9 = ٩
; = گ
= = ≠
[ = چ
\ = ⟨
f = پ
h = ٱ
k = ٫
n = ٰ
t = ڤ
x = «
z = »
[iq_altgr+iq_shift]
' =
- =
/ =
5 = ‰
= = ≈
[ =
\ =
] = ؜
e =
i =
p =
q =
r =
u =
w =
x =
y =
z =

View file

@ -0,0 +1,140 @@
[ir:layout]
' = گ
, = و
- = -
. = .
/ = /
1 = ۱
2 = ۲
3 = ۳
4 = ۴
5 = ۵
6 = ۶
7 = ۷
8 = ۸
9 = ۹
; = ک
= = =
[ = ج
\ = \
] = چ
a = ش
b = ذ
c = ز
d = ی
e = ث
f = ب
g = ل
h = ا
i = ه
j = ت
k = ن
l = م
m = پ
n = د
o = خ
p = ح
q = ض
r = ق
s = س
t = ف
u = ع
v = ر
w = ص
x = ط
y = غ
z = ظ
shift = layer(ir_shift)
altgr = layer(ir_altgr)
[ir_shift:S]
' = ؛
, = >
- = ـ
. = <
/ = ؟
1 = !
2 = ٬
3 = ٫
4 = ﷼
5 = ٪
6 = ×
7 = ،
8 = *
9 = )
; = :
= = +
[ = }
\ = |
] = {
a = ؤ
b =
c = ژ
d = ي
e = ٍ
f = إ
g = أ
h = آ
i = ّ
j = ة
k = »
l = «
m = ء
n = ٔ
o = ]
p = [
q = ْ
r = ً
s = ئ
t = ُ
u = َ
v = ٰ
w = ٌ
x = ٓ
y = ِ
z = ك
[ir_altgr:G]
' = "
, = ,
- = _
. = '
/ = ?
1 = `
2 = @
3 = #
4 = $
5 = %
6 = ^
7 = &
8 = •
9 =
; = ;
= =
[ =
\ =
] =
b =
d = ى
h = ٱ
i =
k =
l = ﴿
m = …
n = ٕ
o =
p =
q = °
v = ٖ
[ir_altgr+ir_shift]
1 = 1
2 = 2
3 = 3
4 = 4
5 = 5
6 = 6
7 = 7
8 = 8
9 = 9

View file

@ -0,0 +1,175 @@
[is:layout]
, = ,
- = ö
. = .
/ = þ
1 = 1
2 = 2
3 = 3
4 = 4
5 = 5
6 = 6
7 = 7
8 = 8
9 = 9
; = æ
= = -
[ = ð
\ = +
] = '
a = a
b = b
c = c
d = d
e = e
f = f
g = g
h = h
i = i
j = j
k = k
l = l
m = m
n = n
o = o
p = p
q = q
r = r
s = s
t = t
u = u
v = v
w = w
x = x
y = y
z = z
shift = layer(is_shift)
altgr = layer(is_altgr)
[is_shift:S]
, = ;
- = Ö
. = :
/ = Þ
1 = !
2 = "
3 = #
4 = $
5 = %
6 = &
7 = /
8 = (
9 = )
; = Æ
= = _
[ = Ð
\ = *
] = ?
a = A
b = B
c = C
d = D
e = E
f = F
g = G
h = H
i = I
j = J
k = K
l = L
m = M
n = N
o = O
p = P
q = Q
r = R
s = S
t = T
u = U
v = V
w = W
x = X
y = Y
z = Z
[is_altgr:G]
, = •
- = \
. = ·
1 = ¹
2 = ²
3 = ³
4 = ¼
5 = ½
6 = ¬
7 = {
8 = [
9 = ]
; = ^
\ = `
] = ~
a = æ
b = “
c = ¢
d = „
e = €
f = đ
g = ŋ
h = ħ
i = →
k = ĸ
l = ł
m = µ
n = ”
o = ø
p = |
q = @
r = ¶
s = ß
t = ŧ
u = ↓
v = „
w = ſ
x = »
y = ←
z = «
[is_altgr+is_shift]
, = ×
- = ¿
. = ÷
1 = ¡
2 = ⅛
3 = £
4 = ¤
5 = ⅜
6 = ⅝
7 = ⅞
8 = ™
9 = ±
a = Æ
b =
c = ©
d = “
e = ¢
f = ª
g = Ŋ
h = Ħ
i = ı
k = &
l = Ł
m = º
n =
o = Ø
p = π
q = Ω
r = ®
s = ẞ
t = Ŧ
u = ↑
v =
w = §
x = >
y = ¥
z = <

View file

@ -0,0 +1,178 @@
[it:layout]
' = à
, = ,
- = '
. = .
/ = -
1 = 1
2 = 2
3 = 3
4 = 4
5 = 5
6 = 6
7 = 7
8 = 8
9 = 9
; = ò
= = ì
[ = è
\ = ù
] = +
a = a
b = b
c = c
d = d
e = e
f = f
g = g
h = h
i = i
j = j
k = k
l = l
m = m
n = n
o = o
p = p
q = q
r = r
s = s
t = t
u = u
v = v
w = w
x = x
y = y
z = z
shift = layer(it_shift)
altgr = layer(it_altgr)
[it_shift:S]
' = °
, = ;
- = ?
. = :
/ = _
1 = !
2 = "
3 = £
4 = $
5 = %
6 = &
7 = /
8 = (
9 = )
; = ç
= = ^
[ = é
\ = §
] = *
a = A
b = B
c = C
d = D
e = E
f = F
g = G
h = H
i = I
j = J
k = K
l = L
m = M
n = N
o = O
p = P
q = Q
r = R
s = S
t = T
u = U
v = V
w = W
x = X
y = Y
z = Z
[it_altgr:G]
' = #
- = `
. = ·
1 = ¹
2 = ²
3 = ³
4 = ¼
5 = ½
6 = ¬
7 = {
8 = [
9 = ]
; = @
= = ~
[ = [
] = ]
a = æ
b = ”
c = ¢
d = ð
e = €
f = đ
g = ŋ
h = ħ
i = →
k = ĸ
l = ł
m = µ
n = ñ
o = ø
p = þ
q = @
r = ¶
s = ß
t = ŧ
u = ↓
v = “
w = ſ
x = »
y = ←
z = «
[it_altgr+it_shift]
, = ×
- = ¿
/ = ÷
1 = ¡
4 = ⅛
5 = ⅜
6 = ⅝
7 = ⅞
8 = ™
9 = ±
[ = {
] = }
a = Æ
b =
c = ©
d = Ð
e = ¢
f = ª
g = Ŋ
h = Ħ
i = ı
k = &
l = Ł
m = º
n = Ñ
o = Ø
p = Þ
q = Ω
r = ®
s = ẞ
t = Ŧ
u = ↑
v =
w = §
x = >
y = ¥
z = <

View file

@ -0,0 +1,95 @@
[jp:layout]
' = :
, = ,
- = -
. = .
/ = /
1 = 1
2 = 2
3 = 3
4 = 4
5 = 5
6 = 6
7 = 7
8 = 8
9 = 9
; = ;
= = ^
[ = @
\ = ]
] = [
a = a
b = b
c = c
d = d
e = e
f = f
g = g
h = h
i = i
j = j
k = k
l = l
m = m
n = n
o = o
p = p
q = q
r = r
s = s
t = t
u = u
v = v
w = w
x = x
y = y
z = z
shift = layer(jp_shift)
[jp_shift:S]
' = *
, = <
- = =
. = >
/ = ?
1 = !
2 = "
3 = #
4 = $
5 = %
6 = &
7 = '
8 = (
9 = )
; = +
= = ~
[ = `
\ = }
] = {
a = A
b = B
c = C
d = D
e = E
f = F
g = G
h = H
i = I
j = J
k = K
l = L
m = M
n = N
o = O
p = P
q = Q
r = R
s = S
t = T
u = U
v = V
w = W
x = X
y = Y
z = Z

View file

@ -0,0 +1,95 @@
[jv:layout]
' = ꦵ
, = ꧈
- = ꦎ
. = ꧉
/ = ꦂ
1 = ꧑
2 = ꧒
3 = ꧓
4 = ꧔
5 = ꧕
6 = ꧖
7 = ꧗
8 = ꧘
9 = ꧙
; = ꧇
= = ꦉ
[ = ꧊
\ = ꧀
] = ꧌
a = ꦻ
b = ꦧ
c = ꦕ
d = ꦢ
e = ꦼ
f = ꦝ
g = ꦒ
h = ꦲ
i = ꦶ
j = ꦗ
k = ꦏ
l = ꦭ
m = ꦩ
n = ꦤ
o = ꦺ
p = ꦥ
q = ꦐ
r = ꦫ
s = ꦱ
t = ꦠ
u = ꦸ
v = ꦛ
w = ꦮ
x = ꦚ
y = ꦪ
z = ꦔ
shift = layer(jv_shift)
[jv_shift:S]
' = "
, = ꦆ
- = _
. = ꦇ
/ = ?
1 = ꧆
2 = ꧏ
3 = ꧃
4 = ꧄
5 = ꧅
6 = ꦿ
7 = ꦽ
8 = ꦳
9 = ꧁
; = ꦈ
= = ꦋ
[ = ꧋
\ = ꦅ
] = ꧍
a = ꦄ
b = ꦨ
c = ꦖ
d = ꦣ
e = ꦌ
f = ꦞ
g = ꦓ
h = ꦃ
i = ꦷ
j = ꦙ
k = ꦑ
l = ꦊ
m = ꦀ
n = ꦟ
o = ꦴ
p = ꦦ
q = ꦰ
r = ꦬ
s = ꦯ
t = ꦡ
u = ꦹ
v = ꦜ
w = ꦍ
x = ꦘ
y = ꦾ
z = ꦁ

View file

@ -0,0 +1,110 @@
[ke:layout]
' = '
, = ,
- = -
. = .
/ = /
1 = 1
2 = 2
3 = 3
4 = 4
5 = 5
6 = 6
7 = 7
8 = 8
9 = 9
; = ;
= = =
[ = [
\ = \
] = ]
a = a
b = b
c = c
d = d
e = e
f = f
g = g
h = h
i = i
j = j
k = k
l = l
m = m
n = n
o = o
p = p
q = q
r = r
s = s
t = t
u = u
v = v
w = w
x = x
y = y
z = z
shift = layer(ke_shift)
altgr = layer(ke_altgr)
[ke_shift:S]
' = "
, = <
- = _
. = >
/ = ?
1 = !
2 = @
3 = #
4 = $
5 = %
6 = ^
7 = &
8 = *
9 = (
; = :
= = +
[ = {
\ = |
] = }
a = A
b = B
c = C
d = D
e = E
f = F
g = G
h = H
i = I
j = J
k = K
l = L
m = M
n = N
o = O
p = P
q = Q
r = R
s = S
t = T
u = U
v = V
w = W
x = X
y = Y
z = Z
[ke_altgr:G]
' = ́
- = ̄
6 = ̂
8 = ̇
9 = ̆
; = ̤
[ke_altgr+ke_shift]
' = ̈
- = ̱
8 = ̣
; = ̤

View file

@ -0,0 +1,95 @@
[kg:layout]
' = э
, = б
- = ө
. = ю
/ = .
1 = 1
2 = 2
3 = 3
4 = 4
5 = 5
6 = 6
7 = 7
8 = 8
9 = 9
; = ж
= = ң
[ = х
\ = ү
] = ъ
a = ф
b = и
c = с
d = в
e = у
f = а
g = п
h = р
i = ш
j = о
k = л
l = д
m = ь
n = т
o = щ
p = з
q = й
r = к
s = ы
t = е
u = г
v = м
w = ц
x = ч
y = н
z = я
shift = layer(kg_shift)
[kg_shift:S]
' = Э
, = Б
- = Ө
. = Ю
/ = ,
1 = !
2 = "
3 = №
4 = ;
5 = %
6 = :
7 = ?
8 = *
9 = (
; = Ж
= = Ң
[ = Х
\ = Ү
] = Ъ
a = Ф
b = И
c = С
d = В
e = У
f = А
g = П
h = Р
i = Ш
j = О
k = Л
l = Д
m = Ь
n = Т
o = Щ
p = З
q = Й
r = К
s = Ы
t = Е
u = Г
v = М
w = Ц
x = Ч
y = Н
z = Я

View file

@ -0,0 +1,170 @@
[kh:layout]
' = ់
, = ៼
- = ឥ
. = ។
/ = ៊
1 = ១
2 = ២
3 = ៣
4 = ៤
5 = ៥
6 = ៦
7 = ៧
8 = ៨
9 = ៩
; = ើ
= = ឲ
[ = ៀ
\ = ឮ
] = ឪ
a = ា
b = ប
c = ច
d = ដ
e = េ
f = ថ
g = ង
h = ហ
i = ិ
j = ្
k = ក
l = ល
m = ម
n = ន
o = ោ
p = ផ
q = ឆ
r = រ
s = ស
t = ត
u = ុ
v = វ
w = ឹ
x = ខ
y = យ
z = ឋ
shift = layer(kh_shift)
altgr = layer(kh_altgr)
[kh_shift:S]
' = ៉
, = ៻
- = ៌
. = ៕
/ = ?
1 = !
2 = ៗ
3 = "
4 = ៛
5 = %
6 = ៍
7 = ័
8 = ៏
9 = (
; = ៾
= = =
[ = ឿ
\ = ឭ
] = ឧ
a = ៿
b = ព
c = ជ
d = ឌ
e = ែ
f = ធ
g = អ
h = ះ
i = ី
j = ញ
k = គ
l = ឡ
m = ំ
n = ណ
o = ៅ
p = ភ
q = ឈ
r = ឬ
s = ៃ
t = ទ
u = ូ
v = ៽
w = ឺ
x = ឃ
y = ួ
z = ឍ
[kh_altgr:G]
' = ៈ
, = ,
- = x
. = .
/ = /
1 =
2 = @
3 = ៑
4 = $
5 = €
6 = ៙
7 = ៚
8 = *
9 = {
; = ៖
= = ៎
[ = ឩ
\ = \
] = ឳ
b = ឞ
e = ឯ
i = ឦ
k = ឝ
o = ឱ
p = ឰ
q = ៜ
r = ឫ
t = ឨ
w = ៝
[kh_altgr+kh_shift]
' = ᧶
, = ᧾
. = ᧿
1 = ៱
2 = ៲
3 = ៳
4 = ៴
5 = ៵
6 = ៶
7 = ៷
8 = ៸
9 = ៹
; = ᧵
[ = ᧪
] = ᧫
a = ᧬
b = ᧻
c = ᧹
d = ᧮
e = ᧢
f = ᧯
g = ᧰
h = ᧱
i = ᧧
j = ᧲
k = ᧳
l = ᧴
m = ᧽
n = ᧼
o = ᧨
p = ᧩
q = ᧠
r = ᧣
s = ᧭
t = ᧤
u = ᧦
v = ᧺
w = ᧡
x = ᧸
y = ᧥
z = ᧷

View file

@ -0,0 +1,95 @@
[kr:layout]
' = '
, = ,
- = -
. = .
/ = /
1 = 1
2 = 2
3 = 3
4 = 4
5 = 5
6 = 6
7 = 7
8 = 8
9 = 9
; = ;
= = =
[ = [
\ = \
] = ]
a = a
b = b
c = c
d = d
e = e
f = f
g = g
h = h
i = i
j = j
k = k
l = l
m = m
n = n
o = o
p = p
q = q
r = r
s = s
t = t
u = u
v = v
w = w
x = x
y = y
z = z
shift = layer(kr_shift)
[kr_shift:S]
' = "
, = <
- = _
. = >
/ = ?
1 = !
2 = @
3 = #
4 = $
5 = %
6 = ^
7 = &
8 = *
9 = (
; = :
= = +
[ = {
\ = |
] = }
a = A
b = B
c = C
d = D
e = E
f = F
g = G
h = H
i = I
j = J
k = K
l = L
m = M
n = N
o = O
p = P
q = Q
r = R
s = S
t = T
u = U
v = V
w = W
x = X
y = Y
z = Z

View file

@ -0,0 +1,95 @@
[kz:layout]
' = э
, = б
- = ө
. = ю
/ = №
1 = "
2 = ә
3 = і
4 = ң
5 = ғ
6 = ,
7 = .
8 = ү
9 = ұ
; = ж
= = һ
[ = х
\ = \
] = ъ
a = ф
b = и
c = с
d = в
e = у
f = а
g = п
h = р
i = ш
j = о
k = л
l = д
m = ь
n = т
o = щ
p = з
q = й
r = к
s = ы
t = е
u = г
v = м
w = ц
x = ч
y = н
z = я
shift = layer(kz_shift)
[kz_shift:S]
' = Э
, = Б
- = Ө
. = Ю
/ = ?
1 = !
2 = Ә
3 = І
4 = Ң
5 = Ғ
6 = ;
7 = :
8 = Ү
9 = Ұ
; = Ж
= = Һ
[ = Х
\ = /
] = Ъ
a = Ф
b = И
c = С
d = В
e = У
f = А
g = П
h = Р
i = Ш
j = О
k = Л
l = Д
m = Ь
n = Т
o = Щ
p = З
q = Й
r = К
s = Ы
t = Е
u = Г
v = М
w = Ц
x = Ч
y = Н
z = Я

View file

@ -0,0 +1,85 @@
[la:layout]
' = ງ
, = ມ
- = ຊ
. = ໃ
/ = ຝ
1 = ຢ
2 = ຟ
3 = ໂ
4 = ຖ
5 = ຸ
6 = ູ
7 = ຄ
8 = ຕ
9 = ຈ
; = ວ
= = ໍ
[ = ບ
\ = ໜ
] = ລ
a = ັ
b = ຶ
c = ແ
d = ກ
e = ຳ
f = ດ
g = ເ
h = ້
i = ຣ
j = ່
k = າ
l = ສ
m = ທ
n = ື
o = ນ
p = ຍ
q = ົ
r = ພ
s = ຫ
t = ະ
u = ີ
v = ອ
w = ໄ
x = ປ
y = ິ
z = ຜ
shift = layer(la_shift)
[la_shift:S]
' = =
, = `
- = ໙
. = $
/ = )
1 = ໑
2 = ໒
3 = ໓
4 = ໔
5 = ໌
6 = ຼ
7 = ໕
8 = ໖
9 = ໗
; = %
[ = -
\ = ໝ
] = }
c = ຯ
d = .
f = ,
g = :
h = ໊
i = ຮ
j = ໋
k = !
l = ?
m = ໆ
p = ຽ
r = _
s = ;
t = +
w =
x = (
z = ₭

View file

@ -0,0 +1,176 @@
[latam:layout]
' = {
, = ,
- = '
. = .
/ = -
1 = 1
2 = 2
3 = 3
4 = 4
5 = 5
6 = 6
7 = 7
8 = 8
9 = 9
; = ñ
= = ¿
\ = }
] = +
a = a
b = b
c = c
d = d
e = e
f = f
g = g
h = h
i = i
j = j
k = k
l = l
m = m
n = n
o = o
p = p
q = q
r = r
s = s
t = t
u = u
v = v
w = w
x = x
y = y
z = z
shift = layer(latam_shift)
altgr = layer(latam_altgr)
[latam_shift:S]
' = [
, = ;
- = ?
. = :
/ = _
1 = !
2 = "
3 = #
4 = $
5 = %
6 = &
7 = /
8 = (
9 = )
; = Ñ
= = ¡
\ = ]
] = *
a = A
b = B
c = C
d = D
e = E
f = F
g = G
h = H
i = I
j = J
k = K
l = L
m = M
n = N
o = O
p = P
q = Q
r = R
s = S
t = T
u = U
v = V
w = W
x = X
y = Y
z = Z
[latam_altgr:G]
, = •
- = \
. = ·
1 = |
2 = @
3 = ·
4 = ~
5 = ½
6 = ¬
7 = {
8 = [
9 = ]
; = ~
] = ~
a = æ
b = “
c = ¢
d = ð
e = €
f = đ
g = ŋ
h = ħ
i = →
k = ĸ
l = ł
m = µ
n = ”
o = ø
p = þ
q = @
r = ¶
s = ß
t = ŧ
u = ↓
v = „
w = ſ
x = »
y = ←
z = «
[latam_altgr+latam_shift]
' = {
, = ×
- = ¿
. = ÷
1 = ¡
2 = ⅛
3 = £
4 = $
5 = ⅜
6 = ⅝
7 = ⅞
8 = ™
9 = ±
\ = }
a = Æ
b =
c = ©
d = Ð
e = ¢
f = ª
g = Ŋ
h = Ħ
i = ı
k = &
l = Ł
m = º
n =
o = Ø
p = Þ
q = Ω
r = ®
s = ẞ
t = Ŧ
u = ↑
v =
w = §
x = >
y = ¥
z = <

Some files were not shown because too many files have changed in this diff Show more