New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

日本語を入力するとドットレジスタの中身がヒドイことになってる #545

Closed
koron opened this Issue Apr 8, 2014 · 32 comments

Comments

Projects
None yet
6 participants
@koron
Member

koron commented Apr 8, 2014

現象を確認した環境 Xubuntu 13.10 + Vim 7.4.131 (GUI版)

preeditの内容を自前で描画している関係か、
その状態の変遷をバックスペースを含むキーシーケンスとして記録している。
そのため cw (日本語入力) を . で繰り返すと、意図しない箇所が消えてしまうことがある。

さらに悪いことに、
これはIM 依存かもしれないがUIM+Mozcの組み合わせでは、
文字列を確定すると確定した文字列が二重で入力されるようなシーケンスになってしまっている。

  1. 挿入モードで「むらおか」と入力し、「村岡」へ変換して確定する。
  2. 挿入モードを抜ける。
  3. . で繰り返す → 「村岡村岡」が入力される。

@koron koron added kind/bug labels Apr 8, 2014

@mattn

This comment has been minimized.

Member

mattn commented Apr 8, 2014

im_is_active == TRUE の時はレジスタに入れない仕組みがいりますね。
実はこれ、だいぶ昔からあるバグです。

@koron

This comment has been minimized.

Member

koron commented Apr 8, 2014

preedit 外すのと、どっちがええかなぁ。
なんか im_is_active == TRUE だけ入れないってすると別のエンバグしそう。

@mattn

This comment has been minimized.

Member

mattn commented Apr 8, 2014

preedit 外すのは @ynkdir さんがパッチ持ってたと記憶。

@ynkdir

This comment has been minimized.

Member

ynkdir commented Apr 8, 2014

簡単に済ますならこれで

diff -r dd44a527c2bd src/mbyte.c
--- a/src/mbyte.c   Sun Apr 06 21:34:04 2014 +0200
+++ b/src/mbyte.c   Tue Apr 08 23:41:22 2014 +0900
@@ -4951,6 +4951,7 @@
             G_CALLBACK(&im_preedit_end_cb), NULL);

     gtk_im_context_set_client_window(xic, gui.drawarea->window);
+    gtk_im_context_set_use_preedit(xic, FALSE);
 }

     void

これは自前でpreeditウィンドウ表示するやつです
https://gist.github.com/ynkdir/10135117
あんまりちゃんと管理できてなくてひさびさに最新ソースとマージしたのでミスってるかもですが

@presuku

This comment has been minimized.

Member

presuku commented Apr 9, 2014

初めまして、こんにちは。

以前より、@ynkdirさんの http://code.google.com/r/yukihironakadaira-vim などからパッチ使わせてもらってました。
この場を借りてありがとうございます :)

それで、本題なのですが、
https://gist.github.com/ynkdir/10135117 のパッチでは
http://ftp.vim.org/vim/patches/7.3/7.3.467 の変更が取り消されているみたいです。
意図したものなら気にしないでください。

@ynkdir

This comment has been minimized.

Member

ynkdir commented Apr 9, 2014

すみませんマージミスです。直しました。

ちなみにこれはプッシュするのは手に負えなさそうなので自分使用になってますです。
これでいいのかどうかというのもありますが。

@presuku

This comment has been minimized.

Member

presuku commented Apr 11, 2014

すみませんマージミスです。直しました。

いえいえ、どうもです。むしろ、自分で更新してきたパッチと
答え合わせができてよかったです。

ちなみにこれはプッシュするのは手に負えなさそうなので自分使用になってますです。
これでいいのかどうかというのもありますが。

たしかにプッシュして採用されるかはわからないですね…
(既にToDoリストには入ってるんでしたっけ?)
なので、こちらも自分の野良ビルド用に使わせてもらってます。
ただ、Linux系で日本入力周りをWindows版と同じ様に便利にするには、
これが必要なのかなと思ってます。

ちなみに、どのパッチがどれに有効なのかまでは確認してないんですが、
@ynkdirさんの下記の3つのパッチ

  • ynkdir-imoverthespot
  • ynkdir-imactivatekey
  • ynkdir-imcursorhold

を当てた状態のvimとuim+mozcで、このドットレジスタの問題もそうですし、
#546 の問題も解決されますし、IMEがOnの状態でi_CTRL-Rの後にレジスタ名を
半角で確定すれば挿入できたり、Windows版でできていたことがほとんど違和感なくできるので、
個人的には必須のパッチになってます。
(INSERTモード時のIMEのステータスを復元するのは、
皆様のご尽力で imactivatefunc が追加され、便利に使わせてもらってます。)

@koron

This comment has been minimized.

Member

koron commented Apr 11, 2014

@presuku

Windows版でできていたことがほとんど違和感なくできる

もうしわけないですが、それに必要なパッチの一覧(URLだとベスト)をあげてもらえますか?
+kaoriya にいれるか、vim-jpに記事書いたほうが良いかなと考えた次第です。

@mattn

This comment has been minimized.

Member

mattn commented Apr 11, 2014

@presuku

This comment has been minimized.

Member

presuku commented Apr 11, 2014

@koronさん
+kaoriyaにはWindows版時代からお世話になってます。
ありがとうございます :)

Windows版でできていたことがほとんど違和感なくできる

もうしわけないですが、それに必要なパッチの一覧(URLだとベスト)をあげてもらえますか?
+kaoriya にいれるか、vim-jpに記事書いたほうが良いかなと考えた次第です。

むむ、この部分だけ見ると少し大げさになってますが、
「Windows版でできていたことがほとんど違和感なくできる」のは
あくまでも自分の観測範囲内の日本語入力周りという事です。

また、大部分の人にとっては、imactivatefuncを使用した
IMEのステータス制御の方が重要な気もします…
(IME OnでInsertモード抜けて、Normalになると自動的にIME Offになる。
その後、再度Insertモードになると自動的にIME Onになるとかできるので)

それで、パッチなのですが@koronさんのbitbucketにある+kaoriyaと、
@mattnさんのコメントにもる@ynkdirさんのgoogle codeから拝借したものを使用してます。

パッチ一覧:

です。

@koron

This comment has been minimized.

Member

koron commented Apr 11, 2014

@presuku ありがとうございます (`・ω・´)ゞ

@ynkdir

This comment has been minimized.

Member

ynkdir commented Apr 11, 2014

ynkdir-imoverthespot

これよりは gtk_im_context_set_use_preedit を使うほうがいいんではと思います。
数年前ためしたときにpreeditウィンドウの実装がIMエンジンごとみたいで見た目が違ったり対応してないIMがあったりで一応自前表示バージョンを書いてみたという感じです。
9割はonthespot表示のコードを削除してるだけです。

@presuku

This comment has been minimized.

Member

presuku commented Apr 16, 2014

ynkdir-imoverthespot から自前表示を削って、
gtk_im_context_set_use_preedit(xic, FALSE); を追加した patch を作ってみたんですが、
https://gist.github.com/presuku/10816060
うちの Ubuntu 12.04 やXubuntu 13.10 の uim-mozc の環境では、
preedit 中のフォントサイズが gvim 側と(大きく)異なる場合に、
preedit 中と、 commit 後でサイズが変わるのが見た目にうるさく、
相当違和感があるので、常用するには厳しい感じです。

細かいこと把握しないで、機械的に作ってたので、 patch の問題かもしれませんのが…

@ynkdir

This comment has been minimized.

Member

ynkdir commented Apr 16, 2014

あーなるほど。そういうのもありますか。

@koron

This comment has been minimized.

Member

koron commented May 6, 2014

uim-ctl.so の判定が甘くて、制御がいい感じにならないなぁ…

@koron

This comment has been minimized.

Member

koron commented May 6, 2014

im_set_active の時に im_get_status (imsf) を現在の状態と違う場合にのみ imaf を呼び出している。

しかしuim-ctl.soを使っていると
タイミングによっては imsf が間違った(期待とは異る)ステータスを返す場合があり、
それにより imaf が呼ばれず、結果として制御ができてないように見えてしまっている。

具体的には

  1. インサートモードに入る
  2. IMEをONにしてなにか入力しESC
  3. . で貼付け
  4. ノーマルモードにも関わらずIMEがオンになってしまう

手順3で瞬間的に挿入モードへ入って出るので、imafが引数1と0で呼ばれる。
この後者の引数0での呼び出し時に imsf が1ではなく0を返しているため
変更が無いとご判定され imaf が呼ばれず、結果的にIMEがONのままになっていた。

@koron

This comment has been minimized.

Member

koron commented May 6, 2014

https://github.com/koron/imcsc-vim/tree/master/uim-ctlso <だいたいこいつのせい。

uimwatch() が別スレッドでget側とは非同期に状態を取得してる。
その更新がなんらかの理由で間に合ってないのだろう…こまったね。

@koron

This comment has been minimized.

Member

koron commented May 6, 2014

@presuku UIMの制御に使ってるスクリプト、教えていただけますか?

@presuku

This comment has been minimized.

Member

presuku commented May 7, 2014

@koron さん
現在は @ynkdir さんの uim-ctl ベースの自作の plugin 使っています。
この plugin で、私の環境ではそれなりに安定して使用できています。
https://github.com/presuku/vim-uim-ctl-imaf
(github今まで使ってなかったので、色々時間かかって申し訳ない…)

元々は、 uim-ctlso と同様に、uim-ctl を使用していましたが、
imaf/imsf 対応の折に、自分でしか使わないと割り切って汎用性を捨て、
大部分のコードを vim script から、 C へ移した自作の改造(改悪?)版を使用してます。
この変更を行ったのは、 @koron さんが書いてあるとおり、
元々の uim-ctl 由来の不安定さを何とかしたいという試行錯誤の結果です。

ynkdir-imoverthespot を使用する前だったと思うのですが、
以前調査した時は IME OnでInsert モード を抜けて、 Normal モードに移行するときに、
get_prop する前に、prop_list_update が3回ほどのあって、
hiragana, direct, direct と更新されるので最後の direct 状態しか取れないなど問題があったり、
そのあたりで、一連の ynkdir さんのパッチの導入するきっかけになったという記憶です。
また、その他に、uim の方で、もっと簡単に現在のステータスの確認などできないかuimのソースも見たりしたのですが、
その時は解決方法を見つけるまでには至りませんでした。
未だに、もっとスマートな方法があれば、ぜひ教えて欲しいと思ってます…

@ynkdir

This comment has been minimized.

Member

ynkdir commented May 15, 2014

すいませんなんかちょうど話題が出てたのでoverthespotのやつ投げてみました
https://groups.google.com/d/msg/vim_dev/SK3t_RsWMqM/K5Quc2PQftkJ

@presuku

This comment has been minimized.

Member

presuku commented May 19, 2014

パッチ投稿ありがとうございます!
さっさと取り込まれてしまえば、IM使う人たちにとっては良いことだと思うのですけどね…

@crazymaster

This comment has been minimized.

Member

crazymaster commented May 6, 2015

すいませんなんかちょうど話題が出てたのでoverthespotのやつ投げてみました
https://groups.google.com/d/msg/vim_dev/SK3t_RsWMqM/K5Quc2PQftkJ

#730 関連でそのパッチを試していたのですが、描画に問題があるようです。
既に入力されていた文字が変換確定後の文字で描画を上書きされるという現象が時々発生するようです。
(<Ctrl-l> で redraw すると正しく表示されます。)

@ynkdir

This comment has been minimized.

Member

ynkdir commented May 31, 2015

たぶん原因はパッチのこの部分だと思うんですが、これがなんなのかは覚えてないです。
なくても動いてる感じですが…

@@ -4569,6 +4613,8 @@
 im_show_info(void)
 {
     int        old_vgetc_busy;
+    int        old_row = gui.row;
+    int        old_col = gui.col;

     old_vgetc_busy = vgetc_busy;
     vgetc_busy = TRUE;
@@ -4577,6 +4623,8 @@
     if ((State & NORMAL) || (State & INSERT))
    setcursor();
     out_flush();
+    gui.row = old_row;
+    gui.col = old_col;
 }

 /*
@crazymaster

This comment has been minimized.

Member

crazymaster commented Jun 2, 2015

その部分を削ると再現しなくなりました。

@crazymaster

This comment has been minimized.

Member

crazymaster commented Jun 2, 2015

別の問題になるのですがパッチを当てた場合、プレエディットが行末を超えた場合の折り返しがされないようです。

@ynkdir

This comment has been minimized.

Member

ynkdir commented Jun 3, 2015

別の問題になるのですがパッチを当てた場合、プレエディットが行末を超えた場合の折り返しがされないようです。

んーいりますかね

@crazymaster

This comment has been minimized.

Member

crazymaster commented Jun 3, 2015

別の問題になるのですがパッチを当てた場合、プレエディットが行末を超えた場合の折り返しがされないようです。

んーいりますかね

いえすみません、さっきの差分のあるなしに関わらずです

@ynkdir

This comment has been minimized.

Member

ynkdir commented Jun 3, 2015

折り返し表示の機能は必須ですか、という意味ですすみません。
なんか難しそうなので。

@crazymaster

This comment has been minimized.

Member

crazymaster commented Jun 3, 2015

折り返し表示の機能がないと行末までいった場合に、これまでに入力した文字に被さることになりますね。

@ynkdir

This comment has been minimized.

Member

ynkdir commented Jun 3, 2015

なるほど

@k-takata

This comment has been minimized.

Member

k-takata commented Aug 30, 2017

8.0.1026で直ったはず。

@k-takata k-takata closed this Aug 30, 2017

@k-takata

This comment has been minimized.

Member

k-takata commented Aug 30, 2017

あ、折り返し表示機能が無いのは課題のままか。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment