Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

前提

 私は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)が効かなくなってしまいました。単語単位の選択を復活させる定義も書かなければならないようですが、ここで力尽きたので時間があるときに調査します。

追記1

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

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

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

追記2

option control V で macOS が不可視文字を入力することがわかりました。これを無効化すればなんとかなります。

complex_modifications.json
{
    "description" : "option + control + V を無効化(不可視文字)",
    "manipulators" : [
      {
        "type": "basic",
        "from": {
          "key_code": "v",
          "modifiers": {
            "mandatory": [
              "option", "control"
            ]
        }
      },
      "to": [
        {
          "key_code": "v",
          "modifiers": [
            "option"
          ]
        }
      ]
    }
  ]
}

full version
https://gist.github.com/usagimaru/838af951533c237a85591eb3c0b4cd1d

usagimaru
ソフトウェアデザイン
https://interactionmania.com
goodpatch
Goodpatch(株式会社グッドパッチ)は東京、ベルリン、台北にあるWeb / iOS / AndroidなどマルチデバイスアプリケーションのUIデザイン会社です。サービスやプロダクトの企画設計から関わりコンセプトメイキング、UX設計、プロトタイピング、UIデザイン、実装までワンストップで提供しています。
https://goodpatch.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした