rcmdnk's blog
Last update

20130607_vim_ime_200_200

Vimで日本語入力をしているとノーマルモードに戻ったと時に 毎回IMEをoffにしてやらないとコマンドが打てません。 これはかなり面倒なのでノーマルモード移行時に 自動的にIMEがoffになるようにしたい所で、 その辺りのまとめというか、自分設定とついでに見つけた情報の寄せ集め。

Sponsored Links

MacでKeyRemap4MacBookを使ってIMEをノーマルモードで必ずオフにする

MacではKeyRemap4MacBookを使ったキーリマップで ノーマルモードに戻るときにESC/ctrl-[を押した際 IMEをオフにするようにしています。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<item>
  <name>ESC to IME off (to English) + Esc + Esc</name>
  <appendix>Enable for all but HHK</appendix>
  <identifier>private.vim.ime_off_ESC</identifier>
  <only>TERMINAL, VI</only>
  <inputsource_only>JAPANESE</inputsource_only>
  <autogen>
    __KeyToKey__ KeyCode::ESCAPE, ModifierFlag::NONE,
    KeyCode::VK_CHANGE_INPUTSOURCE_ENGLISH,
    KeyCode::VK_CHANGE_INPUTSOURCE_JAPANESE,
    KeyCode::VK_CHANGE_INPUTSOURCE_ENGLISH,
    KeyCode::ESCAPE, KeyCode::ESCAPE
  </autogen>
</item>
<item>
  <name>Control + BRACKET_LEFT to IME off (to English) + Esc + Esc</name>
  <identifier>private.vim.ime_new</identifier>
  <only>TERMINAL, VI</only>
  <inputsource_only>JAPANESE</inputsource_only>
  <autogen>
    __KeyToKey__ KeyCode::BRACKET_LEFT,
    MODIFIERFLAG_EITHER_LEFT_OR_RIGHT_CONTROL|ModifierFlag::NONE,
    KeyCode::VK_CHANGE_INPUTSOURCE_ENGLISH,
    KeyCode::VK_CHANGE_INPUTSOURCE_JAPANESE,
    KeyCode::VK_CHANGE_INPUTSOURCE_ENGLISH,
    KeyCode::ESCAPE, KeyCode::ESCAPE
  </autogen>
</item>

ターミナル(含iTerm)及びVim(含MacVim)上で有効になります。

最後にESCを2回使っているのは文字を変換中の場合でも 一気に抜けるためです。 これだと本来のIME変換中のESCの機能(変換中の文字を消すだけ) が失われますが、1回でも消してIMEをオフにする、状態になって 中途半端なので取り敢えず2回に。

KeyRemap4MacBookでは変換中の状態を取る要素が(調べた限り)無いので、 どちらか好みの設定にする、ということで。

また、こういった設定を書いてある所で余り見かけませんが、

1
<inputsource_only>JAPANESE</inputsource_only>

を使うとIMEがON(日本語入力)の時だけ有効になります。

これはGNU screenと併用している時に絶対必要で、 これを外してしまうとGNU screenでコピーモードに入ろうと ctrl-[を押してもすぐESCが押され終了することになり コピーモードが使えなくなります。

ESC1回設定なら特に問題が無いのですが、2回設定の場合は必須。

日本語に戻す際に 英語日本語英語 と言った周りくどいことをしてますが、 これはGoogle日本語入力等を使っていて、入力中に補完表示がある状態で GNU screenのコピーモードに入ろうとプレフィクス+ctrl-[ を押してしまうと補完表示が残る様になってしまったのでその処置です。

IMEをオフにするには KeyCode::VK_CHANGE_INPUTSOURCE_ENGLISHの代わりに KeyCode::JIS_EISUU(USキーボード使用時にも使えます)でもOKです。 (VK_CHANGE_INPUTSOURCE_*と言うバーチャルキーを使ってみたかっただけ。)

追記: 2013/10/23

OS X Mavericksにした所上のVK_CHANGE_INPUTSOURCE_ENGLISHが効かなくなりました。 取り敢えずの所JIS_EISUUで代用。

追記ここまで

追記: 2013/10/24

作者の人に聞いたら動いてる、とのことだったので再び試してみたら動きました。。。 何やら不安定だったのか、単に自分の早とちりだったのか。。。 いずれにしろ、Mavericksでも上のままでも大丈夫です。 (もしアップデート直後に駄目でもOSが安定したら?大丈夫になるはず。。。)

追記ここまで

Windowsでyamyを使ってIMEをノーマルモードで必ずオフにする

Windowsではyamy を使って同じ様な事をしています。

1
2
3
4
5
6
7
8
9
10
11
12
13
# For Cygwin {{{
window Cygwin /cygwin/ : Global
  key A-v = RButton # Paste

  # IL: IME on
  # IC: IME inserting

  key IL-~IC-Esc = $ToggleIME Esc # Make IME off, Exit insert mode
  key IC-Esc = Esc # Stop inserting, Make IME off, Exit insert mode

  key IL-*IC-C-LeftSquareBracket = Esc $ToggleIME Esc # Stop inserting, Make IME off, Exit insert mode
# }}}
window PuTTY /putty/ : Global

cygwin上のみで有効になる様な設定です。 yamyではIMEが有効である(IL)の状態に加え、入力中(IC)と言う状態を使えるので、 上の設定では

  • IMEオンの状態で文字を入力中にESCを押したら入力キャンセル(元々のESCの動き)
  • IMEオンの状態で文字を入力中でないときにESCを押したらIMEをオフにしてESC(ノーマルモードへ)
  • ctrl-[を押したら入力中でもどんな状態でも最初にESCで行動をキャンセルし、IMEをオフにしてESC(ノーマルモードへ)

となっています。

ついでに最初のAlt-vの設定は、 このキーで右クリックをすることにより 貼り付けを出来る様にしてあります。 cygwinputtyに替えて、PuTTYの設定で右クリックが貼り付けになっていれば PuTTYでも同じ事が出来ます。 (ただし、マウスカーソルはターミナル上に無いとカーソル下のウィンドウを選ぶ だけなので注意。)

Macだと元々Command-vが貼り付けでControlと区別されているので ターミナルなどでも貼り付けが使えますが、Windowsだと貼り付けキーが 使えないのでこれで代用を。

追記: 2013/06/28

下記ではGvimやPuTTYでも同じ様な設定を使うため、 Terminalという新しいグループを作って CygwinGvimPuTTY上で有効にするようにしています。 CUIのvim.exeを直接呼び出したWindowは ConsoleWindowClassと言うクラスだと言う事がyamyの調査から確認できるのですが そもそもIMEの変換が良く分からない動きをしたりして、 イマイチちゃんと設定できなかったのでコメントアウトしてあります。 (わざわざCUI版Vimを直接呼び出す必要も無いと思いますし。)

後、上のコードコメントがちょっとおかしいのと $ToggleIMEの前Escが要らない($ToggleIMEで入力を中断してIME Offの動きをするので)点も下では治してあります。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# Terminal/Vim {{{
keymap Terminal : Global
  key A-v = RButton # Paste
  # IL: IME on
  # IC: IME inserting
  key IL-~IC-Esc = $ToggleIME Esc # Make IME off, Exit insert mode
  key IC-Esc = Esc # Stop inserting
  key IL-*IC-C-LeftSquareBracket = $ToggleIME Esc # Stop inserting, Make IME off, Exit insert mode
keymap Global
#}}}

# For Cygwin {{{
window Cygwin /cygwin/ : Terminal
# }}}

# For Gvim {{{
window GVim /Vim/ : Terminal
#window CVim /ConsoleWindowClass/ : Terminal
# }}}

# For PuTTY {{{
window PuTTY /putty/ : Terminal
# }}}
 
keymap Global

追記ここまで

GVimで出来る設定

GVimではCUI版と違い、IMEを制御出来る部分があり、 Vim側だけで詳細に制御出来ます。

1
2
3
4
5
6
7
8
9
" ime setting
if has('multi_byte_ime') || has('xim') || has('gui_macvim')
  " Insert mode: lmap off, IME ON
  set iminsert=2
  " Serch mode: lmap off, IME ON
  set imsearch=2
  " Normal mode: IME off
  inoremap <silent> <ESC> <ESC>:set iminsert=0<CR>
endif

といった感じで.vimrcで設定すればインサートモードやサーチモードに入った時はIMEをONにして ノーマルモードに戻るときにオフにします。

GVimの方は殆ど使わないので実際使ってみないと分からない事もあるんですが、 日本語関連のことだと普通のGVimやらMacVimだと上手く設定が効かなくて、 KaoriYa version (WindowsMac)だと 効く、と言った話も見ました。

Ref: iminsert

Ref: macvim-kaoriya:日本語入力(IM)自動オン/オフ

日本語固定モード

im_control.vim というプラグインを使ってIMEのオン/オフをより詳細に設定する方法が vim UTF-8 日本語版 の中サイトの以下のページにに詳しくあります。基本的にはGVim専用。

Ref: Vim/GVimで「日本語入力固定モード」を使用する

Windows専用ですが、こんなプラグインも。

Ref: Vimのノーマルモード中は自動的にIMEをOFFにする。(Windowsのみ)

Tera Termでの制御シーケンスの使用

普段Tera Termは使わないのですが IMEの制御以外にもシーケンスを使った色々な設定が以下のサイトに詳しくあります。

Ref: vim からの制御シーケンスの使用例

Ref: dodaの日記: IME 制御

Tera Termを使ってない場合でもシーケンスを使った設定や使い方が参考になると思います。

WindowsでAutoHotkeyを使う方法

Autohotkeyはちゃんと使ったことないですが yamyCtrlAltの交換でちょこちょこ不具合がるので ちょっと他のリマップソフトも検討中のため、メモ。 下記のサイトにはimdisable挿入モードノーマルモード 変換の際に自動で変更する設定も載っています。

Ref: VimのノーマルモードでIMEを常時無効化する

追記: 2013/08/04

AutoHotkeyを使い始めたので、AutoHotkeyでの方法を自分でも作ってみました:

追記ここまで

IMEの状態でカーソルの色を変更する

GVim限定ですが、CursorIMというhightlighが定義されていて 通常の時のCursorIMと違う色を設定することでIMEの状態でカーソルの色を変えられます。

1
2
3
4
if has('multi_byte_ime')
  highlight Cursor guifg=NONE guibg=Green
  highlight CursorIM guifg=NONE guibg=Purple
fi

IMEのON/OFFをsyntaxで制御する

vim-jpにこんな話もありました。

Ref: IMEのON/OFFをsyntaxで制御する

以上!

Sponsored Links
Sponsored Links

« OctopressでMac風キーボードのキーを表示をさせるプラグイン gitの更新とHomebrewの導入 »