Karabinerで英数をoption空打ちに割り当てたら不意にDLE文字が入力されて困った話

  • 22
    いいね
  • 2
    コメント
この記事は最終更新日から1年以上が経過しています。

前提

 私はUS配列を愛用しているのですが、それで困るのは「英数」キーと「かな」キーが無いことです。入力切替の度にcmd-spaceは面倒なので、Karabinerで左option空打ちを「英数」、右command空打ちを「かな」としています。
(左がcommandではないのは、ショートカットの入力で不意に英数に切り替わってしまうことが多いからです。)

 また、Cocoaでemacsのカーソル操作が使えるのが私は快適なのでC-p/n/b/f/a/eやC-d/hなども多用します。

いつの間にか謎の見えない文字 DLE – DATA LINK ESCAPE が入力されてしまう

 Cocoaではoptionキーを押しながらカーソル移動をすると単語ごとにジャンプしてくれます。ここにshiftを組み合わせると単語ごとの選択も可能です。特にコーディング時にはメソッド名や変数名の「いいところ」までを一気に選択できるので便利です。

 私は文字入力でのカーソル移動は基本的にすべてemacs風に行っているので、先に挙げた単語移動も多用するのですが、割と多い頻度で起こる、見た目問題ないコードなのにビルドエラーになってしまう現象に悩みました。コード中ならまだエラーが出るので良いのですが、文字列の中身にいたりするとこれに気づかないことが多いです。

1.png
なんやねんこれ

 この見えない文字の部分(: のところ)は幅0pxの文字がいて、前後からカーソル移動していくと1ストローク分待たされる、そんな状態です。Sublime Textにコピペするとこれが DLE - DATA LINK ESCAPE 文字だということがわかりました。

2.png
見えない文字の正体はDLEだった

 見えない文字の正体がわかったところで、これが入力されてしまう原因と対処を考えました。(追記あり)

Karabiner で DLE の入力を防ぐ

 そもそもなぜ DLE が入力されるのか調査したところ、Karabiner で英数/かなをリマップしているのが原因のようでした。control + 左option(英数)、control + 右command(かな) で DLE が出てしまいます。これを防ぐために private.xml を以下のようにしてみました。

    <item>
        <name>Disable DLE</name>
        <identifier>private.disable_dle</identifier>

        <!-- control option,option でDLEが入力されるのを無効化 -->
        <autogen>__KeyToKey__
            KeyCode::OPTION_L, VK_CONTROL, KeyCode::OPTION_L, VK_CONTROL,
            KeyCode::VK_NONE,
        </autogen>

        <!-- control command,command でDLEが入力されるのを無効化 -->
        <autogen>__KeyToKey__
            KeyCode::COMMAND_R, VK_CONTROL,
            KeyCode::VK_NONE,
        </autogen>
    </item>

 これでリロードすると見事 DLE が出なくなったのでめでたしめでたしかと思いきや、こんどは単語単位の選択:option + control + shift + F("→"の代わりにC-f)が効かなくなってしまいました。単語単位の選択を復活させる定義も書かなければならないようですが、ここで力尽きたので時間があるときに調査します。

追記

DLEが入ってしまうのはどうもIMのバグらしく、これを防ぐための設定が Karabiner に備わっておりました。

"Hack for the bug of Mac OS X" のチェックを有効にする。
https://twitter.com/tekezo/status/582170228538220544

takezo さん、ありがとうございました。