質問: 私はsublimetextのプラグインを開発しています。 ダブルクリックで日本語を単語レベルで分割可能にするプラグインです。 現在このプラグインはPackage Controlに登録申請中で、管理者と色々やり取りをしています。 その中で、「この機能は日本語の文章の時のみ有効になるように、.sublime-keymapや.sublime_mousemapの中で、以下のようにcontextを使ってキーバインディングにマスクをかけたほうがいい」と言われました。 ``` { "keys": ["ctrl+left"], "command": "key_select_jp", "args": {"key": "left"}, "context": [ { "key": "preceding_text", "operator": "regex_contains", "operand": "\\p{Jpan}$" } ] } ``` これを元に以下のようなcontextを作ってみたのですが、どうもうまく動きません。operandを色々いじっているのですが、どんな時でも(英語の文章でも)このプラグインが有効になってしまいます。 ``` //パターン1 "context": [ { "key": "preceding_text", "operator": "regex_contains", "operand": "[\\p{Katakana}\\p{Hiragana}\\p{Han}。、,.!? ・「」:”()ー゚゙]$" } ] //パターン2 "context": [ { "key": "preceding_text", "operator": "regex_contains", "operand": "[\\p{Katakana}\\p{Hiragana}\\p{Han}。、,.!? ・「」:”()ー゚゙]" } ] //パターン3 "context": [ { "key": "preceding_text", "operator": "regex_contains", "operand": "[あ-んア-ン一-龠ヴ。、,.!? ・「」:”()ー゚゙]" } ] //など。regex_matchも試したが効果なし。 ``` 正規表現のやり方が悪いのだとは思うのですが、どう指定してやったら解決するのかわかりません。 どなたか何かヒントとなりそうな情報をお持ちの方はいらっしゃいませんか? よろしくお願いいたします。 ちなみにcontextについては、以下のサイトが分かりやすいかと思います。
回答: 私も Sublime Text のパッケージをいくつか作って Package Control に登録しています。 お作りになったパッケージを Sublime Text の `Packages` ディレクトリに入れて、パターン 1-3 で試してみたところ、パターン 1 2 はうまく行きませんが、パターン 3 だと問題なく動作するようです。 ここで「問題なく動作する」というのは具体的には次のことを指しています。 * カーソルがある行の、カーソルよりも前の部分に日本語があるときは `key_select_jp` コマンドが反応する * カーソルがある行の、カーソルよりも前の部分に日本語が無いときは `set_motion` コマンドが反応する(= Sublime Text のデフォルトの動き) ちなみに、私が動作確認をしたときの `.sublime-keymap` の一部は次のとおりです。 ``` { "keys": ["super+left"], "command": "key_select_jp", "args": {"key": "left"}, "context": [ { "key": "preceding_text", "operator": "regex_contains", "operand": "[あ-んア-ン一-龠ヴ。、,.!? ・「」:”()ー゚゙]" } ] }, ``` 私の環境は macOS です。 以下、いくつかコメントです。 * 確証はありませんが、パターン 1 2 の `\\p{Katakana}` といった表現はここでは使えないのではないかと思います。一度確認してみてください。 * ご存知のとおり `context` のドキュメントはあまり無いようなので、他のパッケージを参考にされるのがよいかと思います。すでにパッケージをたくさんインストールされていれば、 `Packages` ディレクトリ以下で検索すると参考例を見ることができます。 ご参考になれば幸いです :)