怪我する前に知っておきたい片手プログラミングのはじめ方

私はふだん両手でプログラムを書いています。
ですが人生何があるかわかりません。
**大なわ跳びで途中から縄に入ろうとして転倒し手首を骨折することもありえます(実体験)。**

予定外に片手が制限されても、もう片方の手を使って変わらないパフォーマンスを出すことができれば、
それは現代の職業プログラマーとしての大きな強みになるでしょう。

この記事では、これから片手プログラミングをはじめたい方に役立つ情報を
**実体験をもとに**書いていきます。

## 片手で高速タイピングする方法
片手でプログラミングするにあたり、最も大きな壁となるのは **タイピングのしにくさ** です。
世の中のキーボードは基本的に両手で使うように設計されており、
片手ではどうしてもタイピング速度が出ません。

この問題にはいくつか解決策が考えられます。

### 気合で頑張る
訓練により、通常のキーボードでもそこそこの速度でタイピングできます。
しかし、どうしても多少はキーボードを目視する必要がありますし、タイプミスしがちです。

安定してブラインドタッチできる方法を選びたいところです。

### 片手専用キーボード
片手で使うことを想定したキーボードがあります。
[Parblo PR200 片手メカニカルゲーミングキーボード](https://www.amazon.co.jp/dp/B01HTK5GH0)

キー配置が片手タイピングに特化しており、慣れればそこそこの速度で入力できます。
**配置を覚え直す必要がある**ので、多少のコストを払っても片手プログラミングをマスターしたい方は
試してみてもいいのではないでしょうか。

### キー配列左右反転
個人的におすすめなのは、両手用のキーボードを使いながらキー配列を工夫する方法。
その中でも、**特定のキーを押している間、キーボードのキー配列を左右反転させる**やり方を紹介します。

[Mirror\-QWERTY: One\-Hand Typing on the Mac App Store](https://itunes.apple.com/us/app/mirror-qwerty-one-hand-typing/id496021762?mt=12)

このアプリを入れると、スペースキーを押している間、
Y → T
J → F
のように、GHのキーを中心に左右のキー配列が反転します。

<img width="547" alt="Mirror-QWERTY" src="https://qiita-image-store.s3.amazonaws.com/0/19366/ea99be39-0178-1fa6-49f9-edb760d15cdb.png">


これで**ホームポジションから片手を動かさずに、ほとんどのキーを押すことができます。**
最初は違和感を感じるかもしれませんが、QWERTY配列のキーボードを使っている人ならすぐ慣れます。
左右のキー配置を反転しただけなので、新しく覚えることもありません。

#### キー配列左右反転(Karabiner使用) 
ただこのアプリ、日本語入力に対応していない、スペースキーを使ったショートカットが軒並み使えなくなるなど
使用感が完璧とはいえません。

そこで、**[Karabiner](https://pqrs.org/osx/karabiner/index.html.ja) でキーマッピングをカスタマイズすることでこのアプリを再現します。**

```xml:private.xml
<?xml version="1.0"?>
<root>
  <item>
    <name>One Handed Typing</name>
    <item>
      <name>Reverse QWERTY layout while Space key pressed.</name>
      <identifier>onehand.reverse_qwerty</identifier>
      <autogen>__KeyOverlaidModifier__ KeyCode::SPACE, KeyCode::VK_MODIFIER_EXTRA1, KeyCode::SPACE</autogen>

      <!-- Reverse right keys -->
      <autogen>__KeyToKey__ KeyCode::Y, ModifierFlag::EXTRA1, KeyCode::T</autogen>
      <autogen>__KeyToKey__ KeyCode::H, ModifierFlag::EXTRA1, KeyCode::G</autogen>
      <autogen>__KeyToKey__ KeyCode::N, ModifierFlag::EXTRA1, KeyCode::B</autogen>
      <autogen>__KeyToKey__ KeyCode::U, ModifierFlag::EXTRA1, KeyCode::R</autogen>
      <autogen>__KeyToKey__ KeyCode::J, ModifierFlag::EXTRA1, KeyCode::F</autogen>
      <autogen>__KeyToKey__ KeyCode::M, ModifierFlag::EXTRA1, KeyCode::V</autogen>
      <autogen>__KeyToKey__ KeyCode::I, ModifierFlag::EXTRA1, KeyCode::E</autogen>
      <autogen>__KeyToKey__ KeyCode::K, ModifierFlag::EXTRA1, KeyCode::D</autogen>
      <autogen>__KeyToKey__ KeyCode::COMMA, ModifierFlag::EXTRA1, KeyCode::C</autogen>
      <autogen>__KeyToKey__ KeyCode::O, ModifierFlag::EXTRA1, KeyCode::W</autogen>
      <autogen>__KeyToKey__ KeyCode::L, ModifierFlag::EXTRA1, KeyCode::S</autogen>
      <autogen>__KeyToKey__ KeyCode::DOT, ModifierFlag::EXTRA1, KeyCode::X</autogen>
      <autogen>__KeyToKey__ KeyCode::P, ModifierFlag::EXTRA1, KeyCode::Q</autogen>
      <autogen>__KeyToKey__ KeyCode::SEMICOLON, ModifierFlag::EXTRA1, KeyCode::A</autogen>
      <autogen>__KeyToKey__ KeyCode::SLASH, ModifierFlag::EXTRA1, KeyCode::Z</autogen>

      <!-- Reverse left keys -->
      <autogen>__KeyToKey__ KeyCode::T, ModifierFlag::EXTRA1, KeyCode::Y</autogen>
      <autogen>__KeyToKey__ KeyCode::G, ModifierFlag::EXTRA1, KeyCode::H</autogen>
      <autogen>__KeyToKey__ KeyCode::B, ModifierFlag::EXTRA1, KeyCode::N</autogen>
      <autogen>__KeyToKey__ KeyCode::R, ModifierFlag::EXTRA1, KeyCode::U</autogen>
      <autogen>__KeyToKey__ KeyCode::F, ModifierFlag::EXTRA1, KeyCode::J</autogen>
      <autogen>__KeyToKey__ KeyCode::V, ModifierFlag::EXTRA1, KeyCode::M</autogen>
      <autogen>__KeyToKey__ KeyCode::E, ModifierFlag::EXTRA1, KeyCode::I</autogen>
      <autogen>__KeyToKey__ KeyCode::D, ModifierFlag::EXTRA1, KeyCode::K</autogen>
      <autogen>__KeyToKey__ KeyCode::C, ModifierFlag::EXTRA1, KeyCode::COMMA</autogen>
      <autogen>__KeyToKey__ KeyCode::W, ModifierFlag::EXTRA1, KeyCode::O</autogen>
      <autogen>__KeyToKey__ KeyCode::S, ModifierFlag::EXTRA1, KeyCode::L</autogen>
      <autogen>__KeyToKey__ KeyCode::X, ModifierFlag::EXTRA1, KeyCode::DOT</autogen>
      <autogen>__KeyToKey__ KeyCode::Q, ModifierFlag::EXTRA1, KeyCode::P</autogen>
      <autogen>__KeyToKey__ KeyCode::A, ModifierFlag::EXTRA1, KeyCode::SEMICOLON</autogen>
      <autogen>__KeyToKey__ KeyCode::Z, ModifierFlag::EXTRA1, KeyCode::SLASH</autogen>
    </item>
  </item>
</root>
```
[(Gist)](https://gist.github.com/suemoc/f04b7631ef569589d102b2a06a26e011)

このprivate.xmlをKarabinerで読み込めば左右反転のマッピングが使えるようになります。
こちらは日本語入力も問題無く使えるので、ぜひ試してみてください。

## 片手プログラマーが使うべきエディタ
プログラミングに欠かせないのがエディタです。
片手プログラマー、とくに右手を使う片手プログラマーにおすすめしたいのが **Vim** です。

ご存知の通り、たいていのキーボードで修飾キー(Ctrl, Commandなど)の配置には左右の偏りがあります。
そして自分の経験上、**修飾キーは左側に偏っていることが多い**のです。
右手派にとっては頭の痛い話です。

**Vimなら、たいていの文章編集を修飾キーを使わずに行えます。**
Ctrlキーなんて使わずにプログラミングできるのです。
片手でプログラミングするなら迷わず Vim を使いましょう。

(`jj`をEscにマッピングしておくと右手の位置を動かさずにinsert modeを抜けられるのでおすすめ)

## おわりに
片手でもプログラマーがパフォーマンスを出すための方法を
自分の経験から紹介しました。

新入り片手プログラマーはもちろん、熟練片手プログラマーの方も、
この記事を読んで何かの参考にしてもらえれば幸いです。

次回、**「怪我する前に知っておきたい？音声入力プログラミングのはじめ方」**
お楽しみに！

(この記事は片手で書かれました)