Automatic Layout Switching for HHKB and Built-in Laptop Kbd 해피해킹과 빌트인 키보드 간의 자동 레이아웃 전환 구성에 대하여

Posted on April 27, 2025

바야흐로 대 랩톱 시대다. 제조사들은 데스크톱에 별로 관심이 없으며, 랩톱을 도킹시켜서 사용하는 인구는 점차로 증가하는 듯하다. 그러면 당연히 기본 내장 키보드와 외부 키보드를 병행해서 사용하게 되는데, 이때 이 둘의 레이아웃이 반드시 같아야 한다는 법은 없다. 예를 들어서 해피 해킹 키보드 (HHKB) 가 있다. HHKB는 Ctrl-Capslock Swap이 하드웨어적으로 이루어져 있는 관계로, 이미 씽크패드에서 소프트웨어적 Swap을 수행한 상태에서 이중으로 뒤집히는 문제가 있다.

다음의 쉘 스크립트 및 nix 설정으로 쉽게 해결할 수 있다. udev에 스크립트를 명시해 주고, 스크립트에서 xinput --list 를 읽어서 그 순간 HHKB가 가진 디바이스 아이디에 대해 setxkbmap 을 수행하게 한다.

원래 이 정도로 할 생각은 없었지만, 디바이스 아이디가 때때로 바뀐다는 사실이 어느 정도 다이나믹한 자동화 구성을 필요로 하게 되었다.

services.udev.packages = [(pkgs.writeTextFile {
  name = "hhkb-layout";
  destination = "/etc/udev/rules.d/42-hhkb-layout.rules";
  text = ''
    ACTION=="change", SUBSYSTEM=="usb", TAG+="systemd", ENV{SYSTEMD_WANTS}+="hhkb-layout@", RUN+="${pkgs.writeShellScript "set-keyboard-layout" (builtins.readFile ../set-keyboard-layout.sh)}"
  '';
})];
# Inspired by https://askubuntu.com/a/337431

keyboard_name="PFU Limited HHKB-Classic  "
layout="us"
device_ids=`xinput -list | grep "$keyboard_name" | awk -F'=' '{print $2}' | cut -c 1-2`

for ID in $device_ids
do
    setxkbmap -v -device "${ID}" -layout us -option ""
done

echo "Switched $(date)"