雑記帳

電子計算機の"明後日"から、他愛もない話まで。

ソフト屋のための「英字入力時の親指シフト」(キー入力における小指の負担軽減策とか)

今回は、珍しく「親指シフトとはなんぞや」とか「カナ入力はちょっと」という方向けに書いてみます。

主旨としては「親指シフトのシフト操作部分だけ流用して英字/記号入力で使うと、ソフト屋にとって結構便利」「Windows環境であれば、とりあえず手持ちのキーボードで試せる」という話ですので、カナ入力アレルギーの方にも目を通してもらえるといいなぁ…と思います。

 

で、親指シフトとはなんぞや

一般的な話をざっくりしてしまうと、スペースキー付近に二種類のシフトキーを追加し、これを使ったシフト操作を行うことで、通常よりも少ない文字キー数でカナ入力できるようにした方式です(ちゃんとした説明はWikipedia辺りをご覧ください)。

実際に親指シフト用として作られたキーボードの例を以下に示します。

イメージ 1

親指のところにある左右のシフトキーを「親指キー(親指左キー・親指右キー)」と呼びます。

フルキー部分が2色に色分けされていると思いますが、これはシフト操作が「同じ手側の親指キーと一緒に押す(ストレートシフト)」「反対の手側の親指キーと一緒に押す(クロスシフト)」という定義になっている為で、各文字キーがどちらの手に属しているのかを示すために、こんなことになっています。上記のカナ配列では、ストレートシフトで上側のカナが、クロスシフトで下側のカナの濁点付きが入力できるため、1キーで3種類のカナ文字を打ち分けることが可能な訳です。

尚、アルファベットの配列はQWERTYになっていて、英字記号類も概ねJIS配列に準拠しています。

 

本来はこのような専用キーボードを使うのが正統で、実際今でも新品の専用キーボードが3種類程販売されていますが親指シフトの動作自体はソフト的に実装可能なものなので、一般的な配列のキーボードで親指シフトを行っている方も多くいらっしゃいます。親指シフトを実現するためのソフトは「親指シフトエミュレータ」と呼称されており、例えば私が作った「親指の友 Mk-2 キーボードドライバ」も、エミュレータとして使えるWindows用のキーボードフィルタドライバです。このようなソフトを使い、親指キーとして既存のキーで親指に近いキーを割り当て(一般的には、変換キーと無変換キー、或いはSpaceキー)、文字キーとのシフトが成立した場合は親指キーとして、成立しなかった場合は本来のキーとして動作させます(SandSなどと呼ばれる方法と同様です)。

このため、普通のキーボードで代用する…といっても、106キーボードのようにスペース付近に2キー以上存在しないと3バンクのシフトが行えません。US配列のキーボードのような長いスペースバーしかないようなタイプでは、親指シフトエミュレータの設定を弄ってクロス時にもストレートと同じ文字が出るように設定し、2バンクのシフトとして使うことになります。

 

ラフで超高速なシフト操作を可能にするテクノロジ(ぇ

さて、ここまでお読みになった方の中には、「別にシフトの種類を増やすだけなら、エミュレータなんてソフトを使わず、システムのキーボートレイアウト定義ファイルの工夫でどうにでもなるんじゃないの?」なんて思った方もいらっしゃるかもしれません。

実は、親指シフトのシフト動作には一工夫が入っていまして、またこれが操作性に対して非常に重要な機能になっているのです。

イメージ 2

まず、これが通常のシフト操作に関するタイミングチャートです(各キーは負論理…Lで押された状態)。よく「Shiftと○○を同時に押す!」とか説明しますけど、実際にはShiftを先に押しながら文字キーを押しますよね。当然、文字キーの後からShiftを押しても効きません。

小指のShiftキーであれば、どうせそんなに早く押せないので先にShiftキーを押すよう強制されても苦になりませんが、スペースバーをShiftキーに見立てて親指で操作してみるとどうでしょう? 意識的に打つことで、ほぼ同時と言える程高速操作ができるのではないかと思いますが、その際、勢い余って文字キーを先に押してしまうことがありませんか? 勿論、意識すれば必ずシフトキーを先行して打つようにすることも可能と思いますが、「どっちを先に押すとか余り考えずに、ほぼ同時に押されればシフトしたと見なす」ようになっていた方がラクに打てるのではないでしょうか。

 

ということで、親指シフトのシフト操作は以下のような挙動になっています。

イメージ 3

文字キーが押されてから一定期間、シフト操作が行われるのを待つようになっています(この期間は実装/設定依存ですが、大体100ms位です)。この期間に親指キーが押されたらシフト操作が確定し、タイムアウトすればシフト無しが確定します。シフトキーが先に押された場合は通常のシフトと同様です。これなら「(ラフに)ほぼ同時押し」をバシバシやってもちゃんと意図通りに入力できますね。実際には、高速操作でシフトが複数の文字キーにかかってしまった場合の考慮(シフトが効くのは1ショットとし、時間的に近い方とシフトが成立したことにする)とかもあるのですが、細かいことはNICOLA規格書辺りに詳しく書いてありますので、そちらを参照下さい。

 

ところで、上記のタイミングを見て頂くと、シフトが押された場合は良いのですが、単独打鍵をした場合に、文字が表示されるまでタイムアウト時間分のラグが発生することがわかると思います。実際に使ってみても、気にしてしまうとはっきりと体感できる程度の遅延量です(まぁ慣れてしまうとそんなもんかと思えてしまうのですが)。

そこで、拙作「親指の友 Mk-2」ドライバでは、以下のような動作を行うようにしています。

イメージ 4

出力が未確定の場面でも「現時点での出力」を出し、親指キーが後出しされたら前の入力をBackSpaceで消し、新しい出力を出し直す…という、大変シンプルな動作です。一応これで、単独打鍵時のタイムラグは一切無くなります。

 

英字入力での親指シフト

さて、ここからが本題です。

通常、親指シフトエミュレータのシフト動作はカナ入力時にしか有効にならないよう実装されています。しかし、先程からちょいちょい出てくる「親指の友 Mk-2」ドライバでは、Windows8~のキーボードドライバの制約のため、*1英字入力とカナ入力で全く同じ動作を行います。つまり、英字入力でも上記親指シフトの同時打鍵判定ロジックが動作している状態です。

このドライバでは、ドライバ本体側でシフト制御とカナの濁音・半濁音に関する処理を行い、カナ配列自体はキーボードレイアウトファイルで定義しています。

ということは、ドライバ側が出すシフト操作(ストレートシフト・クロスシフトの出力)に対応する英字入力時の配列を定義しておけば、各キーに対してプラス2種類の文字を追加できる訳です。ただ、既存の配列でASCIIの文字は全て打てるので、これ以上増えたからって何さという話ですね。

では、こういう風に使ってみると如何でしょう?

イメージ 5

こちらは、前述のドライバに付属する「OASYS-100シリーズ」用のキーボードレイアウト(英字入力時の内容)です。

(ようは、先程の写真に出ている親指シフトキーボード用のレイアウトです。本来このキーボードはOASYS-100シリーズというワープロ専用機のものなのですが、PS/2へのプロトコル変換アダプタを自作することを想定してこのような配列ファイルを同封しています。というか私が使っています。)

 

ここでちょっと先程のキーボードの写真に戻って頂きたいのですが、文字キーが少ないのにお気づきでしょうか?

実はこれ、106キーボードで言うところのEnterキーの左隣一列に相当するキーが存在しないのです(つまり4キー足らない。但し、現在市販されている専用キーボードでは、ちゃんとキーが増えた配列になっています)。106キーボードでは通常ここに"_"やら"{}"やら""やらがありますので、これが無いのはC系の言語でコードを書く人間にとって致命的です。

ということで、この配列では英字入力時のストレートシフト側にかな配列の記号から連想できるASCII記号を仕込むことで、キーの不足分を補っています(尚、@と`は取消キーが増えたせいで場所を奪われている為、上記の場所に納めてあります。クロスシフトは通常のShiftとほぼ同じですが、^~\|のキーだけ法則が崩れてしまっています…)。

注目して頂きたいのは、まず"{}""_"等が通常より打ちやすい場所で打てるということです(""はちょっと微妙ですが…)。この場所なら、小指を一生懸命伸ばしたりホームポジションを崩したりせず、気軽に大量の_を含むキーワードやら{}のブロックを打ったりできるのではないでしょうか。

これによってフルキー右端の1列はあってもなくても構わなくなる訳です。そこで、親指の友 Mk-2ドライバの配列置換機能(あるキーを押した際、他のキーのコードを通知させる機能)を使って、これらのキーに他のキーコードを割り当てることを考えます。例えば、"_\"のキーに"右Shift"、"{["のキーに"Enter"を割り当てれば、前述のOASYS-100系親指シフトキーボードのように、ホームポジションを保ったままこれらの機能キーを使うことができます。また、上記配列表と同じ位置にBackSpaceを置くのも、一見ギョッとしますが使ってみると大変便利です(間違ってもすぐ消せるので)。

勿論、配置についてはまだまだ検討の余地があると思います(あくまでも、OASYS-100用キーボードのカナ記号から連想しただけなので)。このドライバはソースコードを同封していますので、レイアウトファイルを含めて自由に改造可能です(MSのサイトからWDKを落としてくればビルドできます)。本稿をヒントに、より使いやすい配列を追求して頂くのも良いのではないかと思います。

 

応用: Ctrlキーの代用に使う

先程、このドライバではドライバ本体側でシフト制御を行う…という話をチラッとしましたが、ここで行われているのは「親指キーとのシフトが成立したら、通常のシフトと同じようなシフト操作に変換して出力する」という動作です。Windowsには親指シフトのような動作の考慮はありませんので、このようにしないとレイアウトファイル上で出力文字の切替が行えないのです。

先程までの動作では、PS/2キーボードの空きキーコード領域を使って「ストレートシフト」「クロスシフト」なるダミーのコードを用意し、レイアウトファイル上ではこれらのキーとの通常シフト(小指Shiftとかと同じ)によって、文字の出力バンクが切り替わるようにしています。本ドライバでは、ここで生成するシフトコードを固定しておらず、設定によって自由に変更可能としています。

なので、ここで生成するキーを既存のモディファイヤキー(小指のShiftやCtrl等、通常のシフト操作によってキー入力の挙動を変えることができるキー全般を言います)に設定することで、親指シフトの操作によって、これらの通常シフト操作の代用とすることができます。

例えばクロスシフト時のシフト出力を「Ctrl」に変えれば、Cキーとのクロスシフトで「Ctrl + C」…といった入力が可能になります。Ctrlキーに関しては、使用頻度からAキーの左隣にCtrlキーを置くように入れ換えている方も多いと思いますが、これならAキーの隣よりも遥かに打ちやすくなるのではないでしょうか。

 

但し、このような使い方には1つ問題がありまして、単独打鍵時のラグを無くすように改良した方(本ドライバでは零遅延モードと呼んでいます)では、前の操作を取り消すのに「BackSpaceで1文字消す」動作になっているため、入力結果が「文字」ではなく「コマンド」として使われる場合に上手く取り消せません。勿論、ドライバの設定ではこのときの出力キーコードも選べますし、エディタ等の設定を弄ることで上手くアンドゥできるようにすることも可能でしょうが、個人的には、零遅延モードを諦めて(OFFに設定可能です)、同時打鍵のタイムアウトを短め(60ms位)に設定するのが安全かなと思います。

 

尚、デフォルトで親指キーとの同時打鍵の判定が行われるキーは「フルキー部分の文字キー」だけです。

例えば、クロスシフト時のシフト出力を「Alt」に設定し、「Tabキーとのクロスシフト」を入力しても、「Alt + Tab」を入力することはできません。
この設定は「親指シフト設定(キー別)」タブの「属性」列で変更可能です。Tabキーの初期値は「(対象外)」」になっていますが、これを「文字(左)」に設定することで、親指右キーとの同時打鍵でクロスシフトが行われたと認識されるようになります。

イメージ 6

 

2つの設定を共存させる

ここまで、主に2タイプの活用方法について説明しましたが、両者は親指キーの動作として設定すべき値が違いますので、そのままではどちらか片方の機能しか使うことができません。

実は、本ドライバでは設定を2種類持つことができ、LEDの点灯パターンの変化によって、「通常時の操作(設定)」と「一時的な操作(設定)」を切り換えることが可能です。デフォルトでは、ScrollLockのLED点灯で一時的な設定に切り替わるようになっています。これを使い、普段良く使う方を通常時の設定としておけば良いです。

ここで切り替わる設定内容は、「本ドライバで設定可能な内容全て」です。キー配列に関する設定(配列置換やキー別の親指シフト設定など)、或いはもう一方の設定に切り換えるためのLED(指定したLEDのいずれかが状態変化したら切り換える)も切り替わりますので、これらの機能を併用する場合は注意が必要です。

 

ドライバの導入方法

当該ドライバは本体ページのファイル置き場からダウンロード可能です。

32bit版(x86版)と64bit版(x64版)のバイナリが入っていますが、同封のcatファイルには署名が付いていませんので、x64環境下ではそのまま使うことができません。Windowsをテストモードに切り換えた上で、自己署名証明書を作り、これを使って各自で署名を行って頂いた上でインストールする必要があります。x86版であってもセキュアブートが有効になっていると動作できませんので、こちらも予め無効にしておく必要があります。

一応、PlatformSDKさえ入手しておけば、若干の手直しで証明書の作成・署名を行えるバッチファイルを同封していますので、これを使えば多少の負担軽減にはなるのではないかと思います。

若干詳しい説明等は、同封の説明書やバッチファイルを参照下さい。

 

オチ

ここまで読んで頂ければお分かりの通り、本稿は「親指の友 Mk-2 キーボードドライバ」の機能解説です(というか、執筆時点でこれまで説明した「便利な機能」を実装しているのがコレしか無いから止むなしな訳ですが…)。

元々が「自分のため」に作ったドライバですので、ここまで説明してきたように、「ただのドライバ実装タイプの親指シフトエミュレータ」であれば不要な機能が多く組み込まれています。このため、「親指シフト(によるカナ入力)」と聞いて「ライタとか事務方御用達の道具だろ? コード書きがメインの俺には関係ない」と切り捨ててかかるような方にとっても、少なくともこれらの機能については有効活用の余地があるのではないかと思っています。

(本当はソフト屋にとっても、親指シフトのカナ入力は、コメントやらコミットログやら設計書やら客先へのメールやらを書く面倒臭さが大幅に下がるという精神的メリットが有る訳ですけど…。)

親指シフトエミュレータ」という説明文のせいで、上記のような方々から興味や検討の余地を奪っているとしたら、それはそれで口惜しいのでこんな文章を書いてみることにしました(特に、親指でシフト操作を行う点と、それに特化したシフトの制御動作は、カナ入力なんて超ニッチな用途で遊ばせておくのは勿体ない気がしていまして…)。勿論現状のままでは導入の手間と効果のバランスについて色々あると思いますが(特に、私の実装は未署名ドライバですので、x64版では署名のために一手間必要ですし…)、こういった方法に興味を持って頂ければ幸いです。

尚、「導入面倒臭い。ユーザモードからキーフックするタイプで作り直してやる」とか「Windows使わんからxxxに移植したるわ」とか「親指シフトエミュレータ作ってるけど便利そうだから組み込んでみる」みたいなのは歓迎です(ソースを同封していますので、DDKのサンプル由来でないところについては自由に扱っていただければと思います)。

*1:2019/9/7追記 当該ドライバ作成当時はそう勘違いしていました…。詳しくは以下の記事を参照下さい:https://kiyoto-y.hatenablog.com/entry/40176746