Random text by shino
左右分割型の自作キーボードを作ったのを契機に、キーマップをいじってみたメモ。
配列の説明の前に、好き勝手にキーボードの配列(キーマップ)を作ろうというキッカケになった情報をふたつ挙げる。
Eucalyn 配列は論理的な配列である。ローマ字入力での日本語の打ちやすさをかなり重要視したものだ。 印象的な点は、左手に母音 5 キー、右手によく使う子音キーを配置していることである。
一方の居合は物質的 (*) な配列である。一見してとがりまくった配列になっている。似たもの探すのが 難しいのではないだろうか。 印象的な点は、3 段 5 列の配列から大きく離れた 2 段 6 列であることと、 親指にアルファベットキーを割当てていることである。
(*) 物理(は論理的であるため、物理的という単語は論理的と対照させるのは居心地が悪い。
キーマップを考えるに当たり某社のオフィスでキーボードを打っている人たちの姿を観察した。 ソフトウェア系の会社であるため、もちろんコード書きもあるわけだが、キーボードを勢い良く打っている時は チャット、Twitter の場面が多かった。「コードを書く」とはいうが、コード書きの重要な場面は 思考なので (*) 、コード書きの場面ではキーボードを打つ速度は律速ではないと判断した。 そしてチャットや Twitter に書くときの言語は、現在のぼくはほぼ日本語である。 そこで Eucalyn 配列と同じく、ローマ字入力の打ちやすさを方針の第一番目とすることに決めた。
(*) ボイラープレートが多い言語や、ものすごいスピードで打つ(であろう)競技系とかはここでは考えていない。
次に、自分の指の動かしやすさ(または動かしにくさ)について考えたところ、 小指が動きが悪いことがキーを打っているときなストレスのように思えた。 特に左手の小指が動かしづらい。一方、普通のキーボード/QWERTY 配列では小指はそこそこ忙しく、 左手はコントロールキーやシフトキー、右手は記号系やエンターキーなどを担当する。 これを改善すべく、3 段で 4 列の配列を模索することとした。 4 つの指(Finger)をそれぞれ列(Column)に割り当てるということで、FinCol 配列と呼ぶとこにする。
枠として、3 段 4 列を採用する。親指は左右それぞれ 2 キーとする。
,-----------------------. ,-----------------------.
| | | | | | | | | |
|-----+-----+-----+-----| |-----+-----+-----+-----|
| | | | | | | | | |
|-----+-----+-----+-----| |-----+-----+-----+-----|
| | | | | | | | | |
`-----------------------' `-----+-----------------'
,-----------. ,-----------.
| | | | | |
`-----------' `-----------'
場所を表すため次の記号を用いる。数字は指番号で 1 から 4 が人差し指から小指を、0 が親指を示す。 U, M, L は上段(upper), 中段(middle), 下段(lower) である。
,-----------------------. ,-----------------------.
| 4U | 3U | 2U | 1U | | 1U | 2U | 3U | 4U |
|-----+-----+-----+-----| |-----+-----+-----+-----|
| 4M | 3M | 2M | 1M | | 1M | 2M | 3M | 4M |
|-----+-----+-----+-----| |-----+-----+-----+-----|
| 4L | 3L | 2L | 1L | | 1L | 2L | 3L | 4L |
`-----------------------' `-----+-----------------'
,-----------. ,-----------.
| 0U | 0M | | 0M | 0U |
`-----------' `-----------'
ホームポジションは M (middle) のキーである。 また、左右を明示したい場合は、R1M などと書き、これは右手(R)、人差し指列(1)、中段(M)を表す。
前置きが終わったので、具体的な配置に入る。
まずは Eucalyn 配列に倣って、母音 5 キーを左手側に配置する。 人差し指から小指まででは 4 列しか無いためひとつ足りない。 もうひとつの置き方としては、上段または下段に配置する方法と、親指に割り当てる方法が思い浮かぶ。 ここでは、ホームポジションで母音が打てることを重視し、居合に受けた刺激を踏まえて親指ホームポジションを用いる。
枠内の 5 キーの位置は決まったのであとは A, I, U, E, O を割り当てるかだけである。 ここの割当てにはあまり良いクライテリアを思いつかなかった。 そこでそのままの順序で割り当てることにする。なにかより良いクライテリアがあれば変えれば良い。 また、右手親指ホームポジション(R0M)にはスペースキーを割り当てる。空白は日本語でも用いるし、 IME の選択時にもよく用いるためである。
,-----------------------. ,-----------------------.
| | | | | | | | | |
|-----+-----+-----+-----| |-----+-----+-----+-----|
| A | I | U | E | | | | | |
|-----+-----+-----+-----| |-----+-----+-----+-----|
| | | | | | | | | |
`-----------------------' `-----+-----------------'
,-----------. ,-----------.
| | O | | SP | |
`-----------' `-----------'
次はやはり Eucalyn 配列に倣ってローマ字入力でよく使う子音を左手のホームポジションに配置することにする。 最初にも上げた次のページを見ると
日本語では K, S, T, N, H, M, R あたりがよく使われるようだ(感覚ともあっている)。 このうち 4 つを右手ホームポジションに割り当てる。ここでは S, T, M, R の 4 つとした。 K, N は頻度がかなり高いと考えられるが、後述の理由により、このもっとも打ちやすい 4 つの配置からは除外した。 S, T, M, R の配置は次のように決める。
,-----------------------. ,-----------------------.
| | | | | | | | | |
|-----+-----+-----+-----| |-----+-----+-----+-----|
| A | I | U | E | | M | S | T | R |
|-----+-----+-----+-----| |-----+-----+-----+-----|
| | | | | | | | | |
`-----------------------' `-----+-----------------'
,-----------. ,-----------.
| | O | | SP | |
`-----------' `-----------'
子音の次の段階として、右手側の上段と下段を埋める。ここまででローマ字入力が楽になるという方針を 第ゼロ近似として達成しているはずである。これより先の配置を決める理由としては、ローマ字入力以外の 理由も採用しつつ考えていく。
チャット、Twitter 以外に目を向けると、キーボードをよく使うソフトウェアはエディタ(Emacs)と
ターミナル(GNU Screen)である。そこで B/N/P/F と H/J/K/L を使いやすくしてみようと思い立った。
横一列は 4 キーのため、それぉれ並べるのに都合が良い。横の順序は、QWERTY の H/J/K/L に倣い、
←↓↑→
の順序を採用し、B/N/P/F とする。
1つ前の節で、ローマ字入力でよく使うキー N と K を、右手ホームポジションから外した理由がこれである。
あとは上段の下段どちらにどちらを配置するかだけである。この決め手としてはよく使う N と K を打ちやすい 位置に置くこととする。N は人差し指、K は薬指で、上段は中指が一番打ちやすい (*) ため、B/N/P/F を 上段とする。
(*) これは人に依ると思う。
うまいことあまり使わないであろう F と L が打ちにくい小指に割当てられたのは偶然だが良いハマりぐあいである。
,-----------------------. ,-----------------------.
| | | | | | B | N | P | F |
|-----+-----+-----+-----| |-----+-----+-----+-----|
| A | I | U | E | | M | S | T | R |
|-----+-----+-----+-----| |-----+-----+-----+-----|
| | | | | | H | J | K | L |
`-----------------------' `-----+-----------------'
,-----------. ,-----------.
| | O | | SP | |
`-----------' `-----------'
残りは工事の摂動のため、かなりどうでもいいが一応なるべく理詰めで行く。 ちなみに残ったキーは C, D, G, Q, V, W, X, Y, Z の 9 キーである。
最初に右手の親指 (R0U) に置くキーを考える。右手側の 12 個の子音から落ちてはいるが ローマ字入力で使いそうなものとしては G, Y と Z あたりが候補に上がってくる。 このうち Y は、拗音で子音の次に来ることがある。たとえば「きゃ(KYA)」の打鍵を考えると R3L, R0U, L4M となる。右手の薬指から親指の連続は違和感があるため、Y は候補から外す。
G と Z にはあまり違いを感じない。個人的に C-z をアプリ内での選択(Emacs のバッファ選択、 GNU screen の window 選択、Slack のチャンネル選択)に共通で使っているため Z を特別視して 親指に割り当てることとした。
残りの決め方は箇条書きで。
,-----------------------. ,-----------------------.
| Q | D | G | C | | B | N | P | F |
|-----+-----+-----+-----| |-----+-----+-----+-----|
| A | I | U | E | | M | S | T | R |
|-----+-----+-----+-----| |-----+-----+-----+-----|
| V | X | W | Y | | H | J | K | L |
`-----------------------' `-----+-----------------'
,-----------. ,-----------.
| LA | O | | SP | Z |
`-----------' `-----------'
ついでに L0U の空き位置にランチャキー(キーコードは F2 だが使うキーと被らなければ何でも良い)を アサインしている。これはデスクトップ側のキーボードショートカットでランチャにマップしている。 ここでのランチャとは Mac の QuickSilver とか Kupfer のようなものを指す。現在は自作の雑なやつを 使っている。
アルファベットが決まったため、あとは記号などをレイヤでは位置する。 レイヤは多いとコンガラガッてしまうため、なるべく少なくする。基本はこの記号レイヤだけで済ます。
記号レイヤ SY には、まず左手に数字を配置、右手にはホームポジションに日本語入力でもよく使うキーを配置する。 蛇足だが、左手に数字なのは簿記の勉強をしていた時に右手にペン、左手に電卓というのが残っていたからである。
,-----------------------. ,-----------------------.
| | 7 | 8 | 9 | | | | | |
|-----+-----+-----+-----| |-----+-----+-----+-----|
| 0 | 4 | 5 | 6 | | - | , | . | / |
|-----+-----+-----+-----| |-----+-----+-----+-----|
| | 1 | 2 | 3 | | | | | |
`-----------------------' `-----+-----------------'
,-----------. ,-----------.
| | | | | |
`-----------' `-----------'
あとは適当に覚えやすい程度にキーを振っていく。
,-----------------------. ,-----------------------.
| | 7 | 8 | 9 | | " | [ | ] | ~ |
|-----+-----+-----+-----| |-----+-----+-----+-----|
| 0 | 4 | 5 | 6 | | - | , | . | / |
|-----+-----+-----+-----| |-----+-----+-----+-----|
| | 1 | 2 | 3 | | = | ; | : | \ |
`-----------------------' `-----+-----------------'
,-----------. ,-----------.
| | | | | |
`-----------' `-----------'
もうひとつのレイヤは(ほぼ) 記号レイヤに Shift が入っただけのものである。
,-----------------------. ,-----------------------.
|Enter| & | * | ) | | ' | { | } | ` |
|-----+-----+-----+-----| |-----+-----+-----+-----|
| ( | $ | % | ^ | | _ | < | > | ? |
|-----+-----+-----+-----| |-----+-----+-----+-----|
|CapsL| ! | @ | # | | = |sh_l |sh_r | | |
`-----------------------' `-----+-----------------'
,-----------. ,-----------.
| | | | | |
`-----------' `-----------'
Shift とズレているのは以下の 3 種類:
その他、Enter と CapsLock をここに置いている (*)。
(*) 読み返して気づいたが、SY レイヤの同じ位置も空いてるので SY レイヤにおいたほうが良さそうだ
ここでは、コントール、Alt、シフトの修飾キーと長押しでのレイヤ切り替え(qmk_firmware の LT)をまとめて モディファイヤと呼ぶ。どちらも長押しで他のキーと同居させる。
コントール、Alt を押しながら記号キーを押すこともあるため、左にコントールと Alt, 右に SY, SS の レイヤ切り替えを置く。 また Shift は小指ホームに同居させる。
,-----------------------. ,-----------------------.
| | | | | | | | | |
|-----+-----+-----+-----| |-----+-----+-----+-----|
|Shift| | | | | | | |Shift|
|-----+-----+-----+-----| |-----+-----+-----+-----|
| | | | | | | | | |
`-----------------------' `-----+-----------------'
,-----------. ,-----------.
| Alt |Ctrl | | SY | SS |
`-----------' `-----------'
ここに書いたキーだけではいろんなアプリを上手く操作できないこともあるので、OS 側でリマップを行っている。 これはまた別のメモに書く(予定)。
2020-09-14 現在、物質的キーボードとしては Claw44 を使っており、キーマップは次のところに置いてある。 https://github.com/shino/qmk_firmware/blob/develop/keyboards/claw44/keymaps/shino/keymap.c ちょくちょく変えているのでこの記事と外れているかもしれない。