2015年3月22日日曜日

Sublime Text 3でMarkdownする時の日本語入力のバグについて

Sublime Text 3 で Markdown する際に、日本語入力をしたときのEnterの変換確定で文字が消えてしまうバグがイライラしてどうしようもなかったので、原因を探しました。

いろいろなサイトを検索してはみましたが、解決に直結したものは見当たりませんでした。しかし、やはり"Enter"キーのKey Bindsに関するトラブルであることは明白なので、そこら辺を手当たり次第に探した結果、ついに原因を発見!!

本題に入る前に、まず、Sublime Text 3では、Key Bindings - Default の設定が編集できないようになっているみたいなので、これを編集可能な状態にします。

インストールしたプラグインに関しては、~/Library > Application Supports / Sublime Text 3 > Packagesというディレクトリの中にそれぞれの設定ファイルが入っています。インストールしたものでもアーカイブされていてどこにあるのかわからないものも多くあります。探しているプラグインに該当するディレクトリが見当たらなければ、新しくフォルダを作成して、適当な名前を付けておけばOKです。

それぞれのディレクトリに、"Default.sublime-keymap" もしくは、"Default (OSX).sublime-keymap" の何れかの名前が付けられたファイルがあります。
このファイルの中身がそれぞれのプラグインのKey Bindingsになっています。

通常、Sublime Text 3 のメニュー、Sublime Text > Preferences > Package Setting > それぞれのプラグイン名 > Key Bindings - Default から設定ファイルを開きます。設定ファイル自体は開けはしますが、編集が不可能な状態になっています。開いた状態で全てをコピーして、別のテキストエディットでもなんでもいいのですが、それにペイストして、ファイルの名前を "Default.sublime-keymap" もしくは、"Default (OSX).sublime-keymap" にして先ほどのディレクトリに保存します。

この状態で、Sublime Text 3 を再起動すれば、同様にメニューから、Sublime Text > Preferences > Package Setting > それぞれのプラグイン名 > Key Bindings - Default とたどり、設定ファイルを開くと、編集可能な状態になっています。

※ それでも編集が不可能な状態であれば、ファイルの名前の(OSX)の部分を追加・削除してみてください。


さて、いよいよ本題に入ります。

Package Controlからは、Markdownに関して次のようなPackageを導入しています。

  • Markdown Editing
  • SmartMarkdown
  • OmniMarkupPreviewer
  • Table Editor


この中で、Markdownのリストを作成しているときに起きる日本語入力のエラーに関係しているものは、"Markdown Editing" です。
Markdown Editing のKey Bindings の設定ファイルの 324行目〜368行目まで に"Enter" キーのKey Bindings に関する記述があります。

  • Extend lists
  • Extend lists with GFM tasks
  • Extend Numbered Lists
  • Remove empty list item
  • Extend blockquote

に関する設定です。ここの部分が、日本語文字入力の変換確定のEnterキーと競合している部分なので、この
{ "keys": ["enter"]
の部分を、別のキーに変更します。
僕は、"enter" の部分を "shift+enter" としました。

Defaultの設定では、*や+などで、リストをMarkdownする際に、"Enter" を押すと次の行に自動で、*や+を作成してくれます。また、"Remove empty list item" の設定では、*や+と打っておいて、リストに何の記述も行わなかった場合、"enter" を押すと、*や+を削除してくれます。

僕はとりあえず、すべての "enter" キーに関するKey Bindings は、"shift+enter" とし、上記した動作を行いたいときは、"shift+enter" を押せば実現できる状態にしました。
これで、日本語入力は問題ありません。

Table Editor でも日本語入力の確定の際に、似たような不具合がありますが、同様の方法で Table Editorの "enter" キーに関する設定ファイルを書き換えれば、問題なく日本語入力が使えるようになります。

以下に、Markdown Editing のKey Bindings の変更後の設定ファイルの中身を書きます。

    // Extend lists
    { "keys": ["shift+enter"], "command": "insert_snippet", "args": {"contents": "${TM_CURRENT_LINE/^(\\s*([*\\-+])(\\s+)).*/\n$2$3/}"}, "context":
        [
            { "key": "selector", "operator": "equal", "operand": "text.html.markdown", "match_all": true },
            { "key": "preceding_text", "operator": "regex_contains", "operand": "^(\\s*([*\\-+])\\s+)\\S.*", "match_all": true },
            { "key": "auto_complete_visible", "operator": "equal", "operand": false },
            { "key": "selector", "operator": "not_equal", "operand": "markup.raw", "match_all": true }
        ]
    },
    // Extend lists with GFM tasks
    { "keys": ["enter"], "command": "insert_snippet", "args": {"contents": "${TM_CURRENT_LINE/^(\\s*([*\\-+])(\\s+)\\[[ x]\\](\\s+)).*/\n$2$3[ ]$4/}"}, "context":
        [
            { "key": "selector", "operator": "equal", "operand": "text.html.markdown", "match_all": true },
            { "key": "preceding_text", "operator": "regex_contains", "operand": "^(\\s*([*\\-+])\\s+)\\[[ x]\\]\\s+\\S.*", "match_all": true },
            { "key": "auto_complete_visible", "operator": "equal", "operand": false },
            { "key": "selector", "operator": "not_equal", "operand": "markup.raw", "match_all": true }
        ]
    },
    // Extend Numbered Lists
    { "keys": ["shift+enter"], "command": "number_list", "context":
        [
            { "key": "selector", "operator": "equal", "operand": "text.html.markdown", "match_all": true },
            { "key": "preceding_text", "operator": "regex_contains", "operand": "^(\\s*(\\d+\\.)\\s+)\\S.*", "match_all": true },
            { "key": "auto_complete_visible", "operator": "equal", "operand": false },
            { "key": "selector", "operator": "not_equal", "operand": "markup.raw", "match_all": true }
        ]
    },
    // Remove empty list item
    { "keys": ["shift+enter"], "command": "run_macro_file", "args": {"file": "Packages/MarkdownEditing/macros/Remove Empty List Item.sublime-macro"}, "context":
        [
            { "key": "selector", "operator": "equal", "operand": "text.html.markdown", "match_all": true },
            { "key": "preceding_text", "operator": "regex_contains", "operand": "^(\\s*([*\\-+]|\\d+\\.)\\s+)$", "match_all": true },
            { "key": "following_text", "operator": "regex_contains", "operand": "^\\s*$", "match_all": true },
            { "key": "auto_complete_visible", "operator": "equal", "operand": false },
            { "key": "selector", "operator": "not_equal", "operand": "markup.raw", "match_all": true }
        ]
    },
    // Extend blockquote
    { "keys": ["shift+enter"], "command": "insert_snippet", "args": {"contents": "${TM_CURRENT_LINE/^(\\s*((>+\\s+)+([*\\-+]\\s+)?)).*/\n$2/}"}, "context":
        [
            { "key": "selector", "operator": "equal", "operand": "text.html.markdown", "match_all": true },
            { "key": "preceding_text", "operator": "regex_contains", "operand": "^\\s*>+\\s+", "match_all": true },
            { "key": "auto_complete_visible", "operator": "equal", "operand": false }
        ]
    },


以上です。

HTH, Peace.

0 件のコメント:

コメントを投稿