ThinkPadトラックポイントキーボードのFn/Ctrlキー入れ替え方法

# 概要
[ThinkPadトラックポイントキーボード](https://www.lenovo.com/jp/ja/p/accessories-and-software/keyboards-and-mice/keyboards/0b47208)（**KU-1255** / 日本語版: **0B47208**）はトラックポイントが使える貴重な有線USBキーボードとして人気の機種である。Thinkpadの伝統を引き継ぎ、左下の位置にCtrlではなくFnキーが配置されている。

![thinkpad-trackpoint-keyboard-min.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160540/e18b530d-66d5-4e9a-80f7-6d3b7eb5d285.jpeg)

この配置は現代の多くのキーボードとは異なるため、ノートPCとしてのThinkpadにはBIOSを用いたFn/Ctrl入れ替え機能が[標準装備](https://support.lenovo.com/nz/ja/solutions/ht074187)されている。一方で、この外付けUSBキーボードには同様の手段が**公式には提供されていない**。そしてFnキーは特殊キーであり、PC側には押下情報が送出されないため、PC側からFnキーをリマップすることも出来ない。したがって、**キーボードのファームウェア自体を書き換えることが必須**となる。

[**ku1255-firmware-modifier**](https://github.com/haborite/ku1255-firmware-modifier)は、この**KU-1255シリーズのファームウェアを簡単に書き換え、キーリマップ等を行う**ためのソフトウェアである。この記事では、ku1255-firmware-modifierを使って、キーボード内部のファームウェアを書き換えてFn/Ctrlキーを入れ替える方法を説明する。

https://github.com/haborite/ku1255-firmware-modifier

なお、以下の内容は無線タイプの[Thinkpad trackpoint keyboard II](https://www.lenovo.com/jp/ja/p/accessories-and-software/keyboards-and-mice/keyboards/4y40x49522) (KC-1957)には**適用できない**ため注意されたい[^2]。

# 手順
1. 最新版の[ku1255-firmware-modifier-windows.zip](https://github.com/haborite/ku1255-firmware-modifier/releases/download/v0.7.2/ku1255-firmware-modifier-windows.zip)をダウンロード
1. ku1255-firmware-modifier-windows.zipを解凍(右クリック → すべて展開)
1. 解凍されたku1255-firmware-modifier-windowsフォルダ内の`ku1255-firmware-modifier.exe`をダブルクリックして実行
1. おそらくWindwos Defenderによって下記のような警告が出るので、「詳細情報」をクリック → 「実行」を選択（出なければそのまま次に進む）
    ```
    Windows によって PC が保護されました
    Microsoft Defender SmartScreen は認識されないアプリの起動を停止しました
    このアプリを実行すると、PC が危険にさらされる可能性があります
    ```
1. 以下のような画面が起動するので、上のボタン列から`Load config`をクリックする ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160540/3d188069-17a2-4dbd-a7c9-bcaabe0810a6.png)
1. exampleフォルダ内の`Swap-Fn-Ctrl.json`を開く
1. `Main Layer`上で`Fn`と`LCtrl`が入れ替わり、青くハイライトされていることを確認 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160540/e908b863-f6e4-4f5c-a4bd-27aa8ad70845.png)
1. 画面右上の青いボタン`Install firmware`をクリック
1. ファームウェアインストーラーが起動するので、Startをクリック 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160540/92bb1602-94a2-4c4f-8cee-6933a80cc8e1.png)
1. インストールが完了するまで待つ
1. 完了したらインストーラーを閉じる
1. キーボードをUSBから一度取り外し、再接続する

ファームウェアのインストールが完了したら、ku1255-firmware-modifierはもう不要なので削除しても良い

# おまけ

## 任意キーのリマップ
ku1255-firmware-modifier自体はFn/Ctrl入れ替え専用ツールではなく、任意キーリマップツールである。したがって、Fnキーに限らず、**あらゆるキーの再配置が可能**[^1]。変更したい位置のキーをクリックして、割り当てたいキーをプルダウンメニューから選べば良い[^3]。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160540/5374ce49-5559-48ca-953b-7e6f03e867ca.png)

例えば私は「無変換」にBackspaceを、「変換」にEnterを、「カタカナ・ひらがな」に「半角/全角」を割り当てている。KU-1255の日本語版（**0B47208**）はスペースバーが短く（2.5u）、変換・無変換キーが親指でアクセスしやすい位置にあるので使いやすい。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160540/9b6af20a-0b0a-4c91-8575-4a178fbef11d.png)

## レイヤー機能
ku1255-firmware-modifierによってKU-1255に**レイヤー機能を付与**することが出来る。`2nd Layer`で、`Mod`キーと同時押ししたときのキー挙動を定義する。初期状態ではModキーはどこのキーにも割り当てられていないので、どこかのキーを選んで`Mod`キーとして指定する必要がある。Modに割り当てられたキーは赤くハイライトされ、`Main Layer`と`2nd Layer`とで割り当てが異なるキーは緑色にハイライトされる。 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160540/8e48cb97-0624-4812-a793-60986b1616e1.png)

例えば私は、`CapsLock`をModキーとして、IJKLキーに各方向の矢印を2nd layerで割り当てている。ホームポジションを崩さずにカーソル移動が出来るので便利。

## トラックポイント速度Up
トラックポイントの加速度はOS側のマウス設定およびLenovoドライバの設定から変更できるが、両者を最大値にしても速度が物足りない人もいるだろう。その場合は「Trackpoint speed」スライダーからトラックポイント速度を標準の1から最大5まで**上昇させることが出来る**。ただし、速度を上げるとカーソルのブレも大きくなるので、あくまでもOS側での設定で満足出来なかった人用。私は「2」にして運用している。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160540/4f5db355-d8ae-41ff-a534-53a0164677b8.png)

## リカバリー用途として
Lenovoの公式ファームウェアインストーラーは稀にファームウェアインストールに失敗することがあるらしく、公式の手順で単にファームウェアをアップデートしようとして失敗し、キーボードが正しく認識されなかった[例が報告されている](https://github.com/haborite/ku1255-firmware-modifier/issues/2)(`Can't find USB HID Device`エラー)。ku1255-firmware-modifierは非公式のflasherである`FlashSN8`によるファームウェアインストールをサポートしており、`Install Firmware`の▼マークを押して「by FlashSN8」をクリックすることで実行可能。公式ファームウェアインストーラーによってキーボードが壊れてしまった場合のリカバリーとして使うことが出来る。

[^2]: KC-1957におけるファームウェア解析の現状は[こちら](https://github.com/lentinj/tp-compact-keyboard/issues/53)。Fnキーを**除く**キーのリマップ方法は解明されている
[^1]: F13など、もともとキーボード上に存在しないキーをアサインすることも出来る。Colemak, Dvorak, Eucalyn, 大西配列などがプリセットの例として登録されている。
[^3]: ドロップダウンボックスが選択された状態で割り当てたいキーの名前をキーボードで入力するとスムーズ（例: 左Ctrlキーなら「lctrl」のように）