codefirst / aquaskk

An input method without morphological analysis.
GNU General Public License v2.0
350 stars 30 forks source link

JRE込みのPyCharmで日本語入力がおかしい #24

Closed jbking closed 9 years ago

jbking commented 9 years ago

PyCharm: 4.5.3 Build #PY-141.1899, built on July 6, 2015 JRE: 1.8.0_40-internal-b82 x86_64 JVM: OpenJDK 64-bit Server VM by JetBrains s.r.o AquaSKK: 4.2.6 Mac: 10.10.5 (Yosemite)

上記環境において以下の現象が発生しています。

こちらの環境依存の可能性が高いのですが、デバッグ方法をご教授いただけませんでしょうか。

mzp commented 9 years ago

うーん、なんでしょうね。その症状。

とりあえずいつも私がやっているデバッグ方法は

  1. 自分でAquaSKKをビルドする(ログ出力が有効になる)
  2. Console.app でログを確認する
  3. 問題を再発させて、処理の流れを追う

という感じですねぇ。

jbking commented 9 years ago

ログをとってみました。

(分かりづらかったので正常な入力と比較するようにしました)

差分は

AquaSKK[397]: com.jetbrains.pycharm: cancel key event

これのみのようです。

実施手順は

  1. C-jで日本語モードに切り換え
  2. そのまま平仮名で「あき」と入力
  3. lでアスキーモードに切り換え

メッセージアプリ(正常)

2015/09/09 17:59:00.917 AquaSKK[397]: NSEvent: type=KeyDown loc=(0,0) time=0.0 flags=0x40000 win=0x0 winNum=0 ctxt=0x0 chars="
" unmodchars="j" repeat=0 keyCode=38
2015/09/09 17:59:00.917 AquaSKK[397]: event=SKK_JMODE, code=0x6a, attr=none
2015/09/09 17:59:02.669 AquaSKK[397]: NSEvent: type=KeyDown loc=(0,0) time=0.0 flags=0 win=0x0 winNum=0 ctxt=0x0 chars="a" unmodchars="a" repeat=0 keyCode=0
2015/09/09 17:59:02.669 AquaSKK[397]: event=SKK_CHAR, code=0x61, attr=InputChars
2015/09/09 17:59:03.013 AquaSKK[397]: NSEvent: type=KeyDown loc=(0,0) time=0.0 flags=0 win=0x0 winNum=0 ctxt=0x0 chars="k" unmodchars="k" repeat=0 keyCode=40
2015/09/09 17:59:03.013 AquaSKK[397]: event=SKK_CHAR, code=0x6b, attr=InputChars
2015/09/09 17:59:03.221 AquaSKK[397]: NSEvent: type=KeyDown loc=(0,0) time=0.0 flags=0 win=0x0 winNum=0 ctxt=0x0 chars="i" unmodchars="i" repeat=0 keyCode=34
2015/09/09 17:59:03.221 AquaSKK[397]: event=SKK_CHAR, code=0x69, attr=InputChars
2015/09/09 17:59:05.520 AquaSKK[397]: NSEvent: type=KeyDown loc=(0,0) time=0.0 flags=0 win=0x0 winNum=0 ctxt=0x0 chars="l" unmodchars="l" repeat=0 keyCode=37
2015/09/09 17:59:05.520 AquaSKK[397]: event=SKK_CHAR, code=0x6c, attr=SwitchToAscii,InputChars

PyCharm(異常)

  1. C-jで直前の文字が削除される
  2. 母音がaiueoで入力される
2015/09/09 18:00:49.995 AquaSKK[397]: NSEvent: type=KeyDown loc=(0,0) time=0.0 flags=0x40000 win=0x0 winNum=0 ctxt=0x0 chars="
" unmodchars="j" repeat=0 keyCode=38
2015/09/09 18:00:49.995 AquaSKK[397]: event=SKK_JMODE, code=0x6a, attr=none
2015/09/09 18:00:50.000 AquaSKK[397]: com.jetbrains.pycharm: cancel key event
2015/09/09 18:00:54.154 AquaSKK[397]: NSEvent: type=KeyDown loc=(0,0) time=0.0 flags=0 win=0x0 winNum=0 ctxt=0x0 chars="a" unmodchars="a" repeat=0 keyCode=0
2015/09/09 18:00:54.154 AquaSKK[397]: event=SKK_CHAR, code=0x61, attr=InputChars
2015/09/09 18:00:54.601 AquaSKK[397]: NSEvent: type=KeyDown loc=(0,0) time=0.0 flags=0 win=0x0 winNum=0 ctxt=0x0 chars="k" unmodchars="k" repeat=0 keyCode=40
2015/09/09 18:00:54.601 AquaSKK[397]: event=SKK_CHAR, code=0x6b, attr=InputChars
2015/09/09 18:00:54.921 AquaSKK[397]: NSEvent: type=KeyDown loc=(0,0) time=0.0 flags=0 win=0x0 winNum=0 ctxt=0x0 chars="i" unmodchars="i" repeat=0 keyCode=34
2015/09/09 18:00:54.921 AquaSKK[397]: event=SKK_CHAR, code=0x69, attr=InputChars
2015/09/09 18:00:57.874 AquaSKK[397]: NSEvent: type=KeyDown loc=(0,0) time=0.0 flags=0 win=0x0 winNum=0 ctxt=0x0 chars="l" unmodchars="l" repeat=0 keyCode=37
2015/09/09 18:00:57.875 AquaSKK[397]: event=SKK_CHAR, code=0x6c, attr=SwitchToAscii,InputChars

PyCharm (JDKバンドルなし、異常)

  1. C-jで直前の文字が削除される
  2. 母音はかな入力できる(!)、ただしC-jと同様に直前の文字が削除される
2015/09/09 18:08:33.562 AquaSKK[397]: NSEvent: type=KeyDown loc=(0,0) time=0.0 flags=0x40000 win=0x0 winNum=0 ctxt=0x0 chars="
" unmodchars="j" repeat=0 keyCode=38
2015/09/09 18:08:33.562 AquaSKK[397]: event=SKK_JMODE, code=0x6a, attr=none
2015/09/09 18:08:33.567 AquaSKK[397]: com.jetbrains.pycharm: cancel key event
2015/09/09 18:08:34.361 AquaSKK[397]: NSEvent: type=KeyDown loc=(0,0) time=0.0 flags=0 win=0x0 winNum=0 ctxt=0x0 chars="a" unmodchars="a" repeat=0 keyCode=0
2015/09/09 18:08:34.361 AquaSKK[397]: event=SKK_CHAR, code=0x61, attr=InputChars
2015/09/09 18:08:35.061 AquaSKK[397]: NSEvent: type=KeyDown loc=(0,0) time=0.0 flags=0 win=0x0 winNum=0 ctxt=0x0 chars="k" unmodchars="k" repeat=0 keyCode=40
2015/09/09 18:08:35.062 AquaSKK[397]: event=SKK_CHAR, code=0x6b, attr=InputChars
2015/09/09 18:08:35.776 AquaSKK[397]: NSEvent: type=KeyDown loc=(0,0) time=0.0 flags=0 win=0x0 winNum=0 ctxt=0x0 chars="i" unmodchars="i" repeat=0 keyCode=34
2015/09/09 18:08:35.777 AquaSKK[397]: event=SKK_CHAR, code=0x69, attr=InputChars
2015/09/09 18:08:37.209 AquaSKK[397]: NSEvent: type=KeyDown loc=(0,0) time=0.0 flags=0 win=0x0 winNum=0 ctxt=0x0 chars="l" unmodchars="l" repeat=0 keyCode=37
2015/09/09 18:08:37.209 AquaSKK[397]: event=SKK_CHAR, code=0x6c, attr=SwitchToAscii,InputChars
2015/09/09 18:08:37.214 AquaSKK[397]: com.jetbrains.pycharm: cancel key event

(ふと気になってIdeaVimが悪さしているのかと思って無効にしてみましたが結果は変わらずでした。参考まで。)

mzp commented 9 years ago

とりあえず手元で再現するか確認します。

mzp commented 9 years ago
  1. 「C-jで直前の文字が削除される」は確認できませんでした。
  2. JDKバンドルあり版で「母音がaiueoで入力される」が再現するのは確認しました。

とりあえず2を調査します。

mzp commented 9 years ago

cancel key eventはJRE系のアプリでCtrl-Jやlでうまくモード切り替えができない件に対するworkaroundです。 そして、これが誤発動すると、たしかに直前の文字が削除されます。

が、JREを使ってるなら、ないと逆にまずい気がするんですが、なぜ問題になるんだろう....。

mzp commented 9 years ago

workaroundはみつけましたが、不適切な挙動だと思うので、issue報告をしました。 https://youtrack.jetbrains.com/issue/PY-16964

jbking commented 9 years ago

Java系の問題だということだったのでOracle JDKの現時点での最新版、1.8.0_64 (x86_64)をインストールして使うようにしてみたところ、この問題が解消しました。「なぜか」までは追ってませんがご報告まで。

(ログ上では変化みられないように思いますが)該当箇所のコンソールログを添付しておきます。

2015/09/29 13:37:28.332 AquaSKK[38264]: NSEvent: type=KeyDown loc=(0,0) time=0.0 flags=0x40000 win=0x0 winNum=0 ctxt=0x0 chars="
" unmodchars="j" repeat=0 keyCode=38
2015/09/29 13:37:28.333 AquaSKK[38264]: event=SKK_JMODE, code=0x6a, attr=none
2015/09/29 13:37:28.337 AquaSKK[38264]: com.jetbrains.pycharm: cancel key event
2015/09/29 13:37:33.012 AquaSKK[38264]: NSEvent: type=KeyDown loc=(0,0) time=0.0 flags=0 win=0x0 winNum=0 ctxt=0x0 chars="i" unmodchars="i" repeat=0 keyCode=34
2015/09/29 13:37:33.012 AquaSKK[38264]: event=SKK_CHAR, code=0x69, attr=InputChars
2015/09/29 13:37:33.179 AquaSKK[38264]: NSEvent: type=KeyDown loc=(0,0) time=0.0 flags=0 win=0x0 winNum=0 ctxt=0x0 chars="r" unmodchars="r" repeat=0 keyCode=15
2015/09/29 13:37:33.179 AquaSKK[38264]: event=SKK_CHAR, code=0x72, attr=InputChars
2015/09/29 13:37:33.284 AquaSKK[38264]: NSEvent: type=KeyDown loc=(0,0) time=0.0 flags=0 win=0x0 winNum=0 ctxt=0x0 chars="o" unmodchars="o" repeat=0 keyCode=31
2015/09/29 13:37:33.284 AquaSKK[38264]: event=SKK_CHAR, code=0x6f, attr=InputChars
2015/09/29 13:37:33.643 AquaSKK[38264]: NSEvent: type=KeyDown loc=(0,0) time=0.0 flags=0 win=0x0 winNum=0 ctxt=0x0 chars="h" unmodchars="h" repeat=0 keyCode=4
2015/09/29 13:37:33.643 AquaSKK[38264]: event=SKK_CHAR, code=0x68, attr=InputChars
2015/09/29 13:37:33.723 AquaSKK[38264]: NSEvent: type=KeyDown loc=(0,0) time=0.0 flags=0 win=0x0 winNum=0 ctxt=0x0 chars="a" unmodchars="a" repeat=0 keyCode=0
2015/09/29 13:37:33.723 AquaSKK[38264]: event=SKK_CHAR, code=0x61, attr=InputChars
2015/09/29 13:37:35.420 AquaSKK[38264]: NSEvent: type=KeyDown loc=(0,0) time=0.0 flags=0 win=0x0 winNum=0 ctxt=0x0 chars="l" unmodchars="l" repeat=0 keyCode=37
2015/09/29 13:37:35.420 AquaSKK[38264]: event=SKK_CHAR, code=0x6c, attr=SwitchToAscii,InputChars
mzp commented 9 years ago

ありがとうございます。 なぜだろう...。

解消した問題は「C-jで日本語入力に切り換えするときに直前の文字が削除される」「aiueoが入力できない」の両方ですか?

jbking commented 9 years ago

はい、両方ともです…謎い

普段使いしてみてまた何かおかしなことを見つけたら報告します。 ともあれ、ありがとうございました!

mzp commented 9 years ago

なるほど。了解です。とりあえず close ということで...。