Skip to content
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

i(nore)?mapが発動するとIMEが勝手にOFFになってしまう #251

Closed
ledyba opened this issue Sep 12, 2012 · 13 comments
Closed

i(nore)?mapが発動するとIMEが勝手にOFFになってしまう #251

ledyba opened this issue Sep 12, 2012 · 13 comments

Comments

@ledyba
Copy link

ledyba commented Sep 12, 2012

はじめまして。
Windows Vista32bit版とWindows7 64bit版で、公式のバイナリとKaoriya 32/64ビット版のgvimで確認したのですが、

inoremap <UP> <c-\><C-O>gk
inoremap <DOWN> <c-\><C-O>gj

と設定すると、IMEオンで入力中に上下移動するとIMEが勝手にオフになってしまうようです。
i(nore)?mapを使わずに手動でコマンド入力するとIMEはOFFにならず、コマンド入力前の状態を保持してくれるので、i(nore)?map特有のバグだと思うのですが、他に症状を確認された方などいらっしゃいますか?

# どこに投げれば良いのか分からなかったのですが、ここで良かったのでしょうか…?

@Shougo
Copy link
Member

Shougo commented Sep 12, 2012

InsertLeave時に、IMEをオフにする設定があるのではないでしょうか。
まだ詳しい確認はしていませんが、<C-o>を実行した時に一度Insertmodeを抜けるのでInsertLeaveが呼ばれるのではないかと思います。

@Shougo
Copy link
Member

Shougo commented Sep 12, 2012

<C-o>時に、InsertLeaveイベントが呼ばれるのを確認しました。

autocmd InsertLeave * echomsg 'hoge'

を実行しておくと確認できるはずです。おそらくバグではなく、仕様だと思います。

@koron
Copy link
Member

koron commented Sep 12, 2012

ちょっと遠回りな解決策ですが i_ に「見た目行」での下移動(gj相当)が実装されてても良いかもですね。Vim本体に機能追加、という形で。

@ledyba
Copy link
Author

ledyba commented Sep 12, 2012

こんにちは。ありがとうございます。

Shougoさん

vimrc/gvimrcを削除して素の状態にして確認してみました。
仰るとおり、手動の<C-O>gjで移動した場合も、i(nore)?mapで移動した場合も、どちらも挿入モードから一旦抜けてまた入る扱いみたいです。
手動のgjの場合はIMEがONの状態で挿入モードに戻るので、やはりmap特有の何かがあるように思うのですが…。

koronさん

私もそう思います。

@koron
Copy link
Member

koron commented Sep 12, 2012

@ledyba

手動のgjの場合はIMEがONの状態で挿入モードに戻るので、やはりmap特有の何かがあるように思うのですが…。

手で i_ した時はイベントが発生しないけど、マップ経由で行った時は発生するみたいなルールがあってもおかしくないですね。いずれにせよ現在のところ @ledyba さんの目的を達成する正当な手段はないでしょう。

@koron
Copy link
Member

koron commented Sep 12, 2012

あ~ちがう。わかったわかった。

  • iminsertの値を更新するのは、ESCでinsertモードを抜けた時だけ
  • iminsertの値を適用するのは、後にinsertモードに戻った時にも

ってなってます。その証拠に、IME ONのままESCでinsertモードを抜けて、その後再度insertモードですれば、こんどはIMEがOFFにならない。

なので、Vimの実装のバグですね。C-Oで抜けるときもiminsertを更新するようにする、ってのが簡単に思いつく解決策だが…なんか副作用有りそうw

@koron
Copy link
Member

koron commented Sep 12, 2012

@だれか: 過去にiminsertの更新タイミングについて議論していた場所があったと思ったんだけど見つけられません。知っていたら教えて下さい。

@koron
Copy link
Member

koron commented Sep 12, 2012

IME ONのままESCでinsertモードを抜けて、その後再度insertモードですれば、こんどはIMEがOFFにならない。

ついでに、この状態でIME OFFにしてからするとIMEがONになるはずw

@ledyba
Copy link
Author

ledyba commented Sep 12, 2012

@koronさん
なるほど…。

IME ONのままESCでinsertモードを抜けて、その後再度insertモードですれば、こんどはIMEがOFFにならない。
ついでに、この状態でIME OFFにしてからするとIMEがONになるはずw

私の環境でも両方とも再現しました…。

@h-east
Copy link
Member

h-east commented Sep 12, 2012

@だれか: 過去にiminsertの更新タイミングについて議論していた場所があったと思ったんだけど見つけられません。知っていたら教えて下さい。

#64 iminsertとimdisableが直ちには反映されない」ですね。
Githubのsearch機能が腐ってるっぽいですw

@koron
Copy link
Member

koron commented Sep 12, 2012

@h-east Thanks! 検索で日本語が使えるようになった時にindexが飛んだのかしらね?w

@koron
Copy link
Member

koron commented Sep 12, 2012

iminsert の件は #228 へ続いていた。

@koron
Copy link
Member

koron commented Sep 12, 2012

duplicated #228 なのでこっちは閉じます。

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

No branches or pull requests

4 participants