PFU の高級キーボード Happy Hacking Keyboard (略称 HHKB) を買った。昨年に US キーボード配列の Macbook Pro を買ったのでデスクトップと合わせたくなったのと、左 Ctrl キーが初めから A の隣りにあること、◇キーへの憧れがあって選択。この記事では Linux 向けに行った設定を記録する。

1. HHKB Professional HYBRID Type-S

購入したモデルは HHKB Professional HYBRID Type-S 英語配列/墨 (PD-KB800BS)。US キーボード配列で、PC との接続には USB Type-C と Bluetooth を使うことができる。価格は 35,000 円を越えており、これまで使っていたサンワサプライの 3,500 円のキーボード SKB-KG2BK と比べると、その値段、実に10倍である。

何かわかるかもしれないので比較してみる。

項目 旧キーボード 新キーボード
メーカー サンワサプライ PFU
モデル名 SKB-KG2BK PD-KB800BS
キー配列 日本語 英語
キー数 103 60
ストローク 3.8±0.3 mm 3.8 mm
キーピッチ 19 mm 19.05 mm
キースイッチ メンブレン 静電容量無接点方式
押下圧 55±10 g 45 g
本体重量 460g 540g (電池含まず)

キーストロークの深さやキーピッチについてはほとんど変わらない。

キースイッチの静電容量無接点方式は、PFU と Realforce、中国メーカーの Niz のみでしか採用されていない方式。キーが物理的に接地しないので独特のタッチ感と静音性を持つらしい。サンワサプライのキーボードはタイプ音がうるさくてリモート会議中に遠慮していたが、HHKB では気にしなくて済むようになった。まあ HHKB も無音というわけでなく、SHIFT キーを離したときの音はそこそこ気になる。

本体は随分重いなと思ったら 100 g も重くなっていた。持ち運ぶつもりも無いので多少重いくらいの方が安定して良いのではないだろうか。

でもサンワサプライも値段の割にはなかなか悪くないキーボードだったと思う。5年前にヨドバシカメラで適当に叩いて買ったものだ。

2. PC 環境

  • キーボード: PFU (PD-KB800BS) HHKB Professional HYBRID Type-S 英語配列/墨 Happy Hacking Keyboard | HHKB HYBRID Type-S | PFU
  • Bluetooth 接続
  • OS: Fedora 33 Workstation Edition
  • Desktop: X11 + Gnome 3.38.4
  • Text Editor: Emacs 27.1 + Spacemacs + SKK + AZIK
  • Input: iBus 1.5.23 + Mozc 2.23.2815.102-13

3. キーボード DIP スイッチ設定

HHKB では本体背面に DIP という 6 ビット分のスイッチが付いており、これを切り替えることでデフォルト動作を変更できる 1

DIP スイッチは下記の設定にした。

SW1 SW2 SW3 SW4 SW5 SW6
OFF ON ON ON OFF OFF

SW1, SW2: Mac モード

はじめ HHKB モードで行くつもりだったが、HHKB モードでは◇キーが無変換、変換キーのキーコードを送信するらしく、なんかダサいので Mac モードにした。

HHKB モードでは、左◇キーが無変換として認識された。

KeyPress event, serial 28, synthetic NO, window 0x3000001,
    root 0x6c5, subw 0x0, time 2303537, (163,68), root:(213,155),
    state 0x10, keycode 102 (keysym 0xff22, Muhenkan), same_screen YES,

右◇キーは無変換として認識された。

KeyPress event, serial 28, synthetic NO, window 0x2600001,
    root 0x6c5, subw 0x0, time 7555900, (-288,352), root:(576,1348),
    state 0x10, keycode 100 (keysym 0xff23, Henkan_Mode), same_screen YES,

keycodes/evdev で、キーコード 100、102 がそれぞれ無変換、変換として定義されている。

$ egrep '100|102' /usr/share/X11/xkb/keycodes/evdev
/usr/share/X11/xkb/keycodes/evdev:      <MUHE> = 102;   // Muhenkan
/usr/share/X11/xkb/keycodes/evdev:      <HENK> = 100;   // Henkan

DIP スイッチを切り替えて Mac モードにすると、左右の◇キーはそれぞれ 133、134 になった。

KeyPress event, serial 29, synthetic NO, window 0x2600001,
    root 0x6c5, subw 0x0, time 8672890, (1253,-273), root:(2117,723),
    state 0x14, keycode 133 (keysym 0xffeb, Super_L), same_screen YES,

KeyPress event, serial 28, synthetic NO, window 0x2600001,
    root 0x6c5, subw 0x0, time 9003679, (-170,455), root:(694,1451),
    state 0x10, keycode 134 (keysym 0xffec, Super_R), same_screen YES,

keycodes/evdev でキーコード 133, 134 は LWIN、RWIN であると一旦定義されているが…

$ egrep '133|134' /usr/share/X11/xkb/keycodes/evdev
        <LWIN> = 133;
        <RWIN> = 134;

symbols/pc でそれぞれ Super_L、Super_R に置き換えられている。

$ egrep 'LWIN|RWIN' /usr/share/X11/xkb/symbols/pc
    key <LWIN> {        [ Super_L               ]       };
    key <RWIN> {        [ Super_R               ]       };

SW3: Delete=’BS’

Delete キーが Backspace になるようにした。

SW4: Left ◇=’Fn’

さっき◇キーが Super キーになって喜んだばかりだが、左◇キーは Fn にしてしまうことにした。このあと Vi 風キーバインドで Fn + hjkl でカーソルキーを動かせるようにしたとき、左にも Fn キーが有った方が押し易いからである。

SW5: ◇=’◇’, Alt=’Alt’

SW5 を ON にすると◇キーと Alt キーを逆にできるらしいが、そのままにした。

SW6: Power Saving Enabled

Sw6 だけは他のスイッチと異なり、キーボード配列ではなく省電力設定を切り替える。SW6 が OFF のとき省電力モードは ON で、Bluetooth 接続時に 30 分間無操作だとキーボードがスリープ状態になる。

ただしその後 USB Type-C で有線接続することにしたので、この機能は使用していない。

4. キーマップ変更

Happy Hacking Keyboard キーマップ変更ツールというソフトが公式から出されており、キーを押したときのキーマップを自在に変更できる 2。残念ながら Linux には対応していないので、Windows か Mac の PC と接続して使う必要がある。CUI でもいいから欲しいなあ。

まだ試行錯誤中だが、現時点で以下のように変更している。

操作 キーマップ メモ
Fn + h Left vi 風に左キー
Fn + j Down vi 風に下キー
Fn + k Up vi 風に上キー
Fn + l Right vi 風に右キー
Fn + [ Page Up デフォルトで Up キーになるところを Page Up に
Fn + ; Home デフォルトで Left キーになるところを Home に
Fn + ‘ End デフォルトで Right キーになるところを End に
Fn + / Page Down デフォルトで Down キーになるところを Page Down に
Fn + Backspace Delete  
Fn + n かな さらに iBus の設定で入力モード (あ) になるようにした

Fn キー + kjhl = 上下左右キー

Fn キー + kjhl をそれぞれ上下左右キーとして動作させるキーマップがかなり便利だったので紹介する。

Linux (Gnome?) では、ターミナルをはじめ一部のソフトで Ctrl + pnbf を使いカーソルを動かせるようになっている。しかし、使えない場面も神出鬼没にある上、状態によっては別のコマンドが割り当てられている場合がある。例えば Web ブラウザでは Ctrl + n を押すと新しいウィンドウが開くので、下キーを押したつもりが誤爆して新しいウィンドウが開くと結構驚いてしまうから、やはり上下左右キー以外の役割を持たないキーマップが欲しいところだ。そこで Fn + kjhl なら慣れた感じでほとんど無意識に押せて安心・快適に使える。

なお Emacs 風の Ctrl + pnbf の方が元々の操作と親和性が高いように思えるが、そうせずにわざわざ Vim 風を選択した理由は、Vim 風なら片手だけで押せるからだ。これなら左手がパンを持ったりしていて塞がっていても操作できる。ただ一つの欠点があるとすれば、Fn + h (左) と Ctrl + h (Backspace) を両方とも無意識に使っているので、混乱して入れ替えて押してしまうことが有る。

5. Gnome 設定

アクティビティ画面の表示方法

Gnome のデフォルト設定では、Super キーを押すとアクティビティ画面が表示される。これでは Super キーの組み合わせが使えず、せっかくの Super キーが勿体無いので無効した。

$ gsettings get org.gnome.mutter overlay-key
'Super_R'
$ gsettings set org.gnome.mutter overlay-key ''

キーボードショートカット

正直デスクトップ環境のショートカットにはあまり興味が無いのだが、とりあえず以下を設定してみた。

# ウィンドウが覆われていれば最前面に、そうでなければ最背面に移動する
org.gnome.desktop.wm.keybindings raise-or-lower ['<Super>d']

あと GUI で「アクティビティ画面を表示する」に ‘+Space' を設定した。

キーリピート設定

キーが軽くなってタイピングし易くなったので、キーリピートの遅延を減らすと共にリピート速度を上げた。手が慣れたらもっと高速化できそうな気がする。

$ gsettings set org.gnome.desktop.peripherals.keyboard delay 150
$ gsettings set org.gnome.desktop.peripherals.keyboard repeat-interval 30

6. スリープからの起動

その後、使っていると Bluetooth 接続は不安定だったので止めて、USB Type-C で有線接続することにした。 有線接続の場合、スリープからの起動の設定を行う必要はない。

Wake on LAN

Bluetooth 接続になったのでキーボードからスリープ解除できなくなった。本体の電源ボタンを押しても全然構わないのだが、せっかくなので Wake on LAN で起動する方法を模索してみる。

以下のように Wake-on が g になっていれば Wake on LAN が有効らしい。しかしどうも期待通り動かないので調査中。

$ sudo ethtool eno1 | grep Wake-on
        Supports Wake-on: pumbg
        Wake-on: g

USB Bus 設定 (失敗)

HHKB で PC をスリープから起動するため、以下のような設定も試したが思った通り効果は無かった。

$ dmesg
[    8.895303] input: HHKB-Hybrid_1 Keyboard as /devices/virtual/misc/uhid/0005:04FE:0021.0004/input/input
19
[    8.895519] input: HHKB-Hybrid_1 Consumer Control as /devices/virtual/misc/uhid/0005:04FE:0021.0004/inp
ut/input20
[    8.895583] hid-generic 0005:04FE:0021.0004: input,hidraw3: BLUETOOTH HID v0.01 Keyboard [HHKB-Hybrid_1
] on a8:6d:aa:f8:12:71

$ lsusb | grep -i bluetooth
Bus 001 Device 003: ID 8087:0aa7 Intel Corp. Wireless-AC 3168 Bluetooth
$ dmesg | grep -i 8087
[    2.121539] usb 1-5: New USB device found, idVendor=8087, idProduct=0aa7, bcdDevice= 0.01
$ find /sys/devices/pci0000:00 -type d -name usb1
/sys/devices/pci0000:00/0000:00:01.3/0000:01:00.0/usb1
$ cat /sys/devices/pci0000:00/0000:00:01.3/0000:01:00.0/usb1/1-5/power/wakeup
disabled
> echo enabled | sudo tee /sys/devices/pci0000:00/0000:00:01.3/0000:01:00.0/usb1/1-5/power/wakeup
enabled

7. Emacs + Spacemacs + SKK + AZIK

AZIK に us101 モードが用意されており、skk-azik-keyboard-type を変更しただけで期待通りの動きになった。

(defun dotspacemacs/user-config ()
 
 (setq default-input-method "japanese-skk"
       skk-use-azik t
       skk-azik-keyboard-type 'us101)
 (add-hook 'skk-mode-
           '(lambda ()
              (auto-fill-mode -1)
              (setq truncate-lines nil
                    skk-auto-insert-paren nil
                    skk-henkan-strict-okuri-precedence t
                    skk-check-okurigana-on-touroku t
                    skk-dcomp-activate t
                    skk-dcomp-multiple-activate t
                    skk-dcomp-multiple-rows 10
                    )))
 ; Enter SKK mode on isearch-mode C-s
 (add-hook 'isearch-mode-hook 'skk-isearch-mode-setup)
 (add-hook 'isearch-mode-end-hook 'skk-isearch-mode-cleanup)
 (global-set-key (kbd "C-x j") 'skk-mode)
 
)

ただし “「” を入力しようとしても、同キーがカタカナモード切替のキーと衝突して入力できなくなってしまった。これも公式で対策が用意されており、先に “x” を打ち “x「” とすると入力することができる 3

8. その他: キートップステッカー

HHKB は全体的にいい感じだが、キートップがサラサラの質感だったのが誤算だった。PBT という経年劣化に強い素材が使われているらしい。私の指先はやけに渇いているのでキートップがサラサラ素材だと滑って疲れる (特に Emacs 使用中の左手小指)。さらに、爪の接点がなぜか指先からはみ出しているため、キートップに爪が当たって引っ掻き不愉快な感触と音に襲われる。昔買った SAMURAI 正宗というゲーマー向けのキーボード滑り止めステッカー 4 を左 SHIFT 及び A/S/D/X/C/V キーに貼り付けた。個人的には必需品なのだがもう販売していないらしい。需要無いのか?

その後、正宗が足りなくなったので新しくエス・クリエイトの「Griiip!」という滑り止めシール 5 を買ったところ、これもいい感じ。見た目が少しダサいが、滑り止め機能、クッション機能はむしろ正宗より優れている。フリーカットタイプを購入して、鋏で切り出しながら使っている。

9. 参考資料