c
,s
,r
コマンドで、書き換え前の文字列に応じてIMオン/オフを切り替えるVimプラグインを作りました
Vim Advent Calendar 2013の92日目(2014-03-02)の記事です。
普段はtutcode keymapを使って日本語を入力しているのですが、
ソースコード編集時に、
関数名書き換え等の際にたびたび日本語入力をオフにする操作を
していることに気づきました。
書き換え前の関数名はASCII文字しか使っていないので、
こういう場合は最初から日本語入力はオフにしておいて欲しい、
と思ったのでプラグインcontextimi.vimを作りました。
以下の機能を提供します。
- ASCII文字列を
c
、s
、r
で書き換える際は、IMをオフに切り替え - 日本語文字列を
c
、s
、r
で書き換える際は、IMをオンに切り替え
使い始めたばかりですが、今のところほとんど違和感なく使えています。
("ASCIIで"を"日本語で"に書き換えようとすると
IMオフになっていらつくことはありました。
書き換え前の文字列に加えて、その前後の文字まで見る方がいいのかも)
IMのオン/オフの切り替え制御
IMのオン/オフの切り替え制御は、デフォルトでは
&iminsert
の値を2や0に設定することで行います。(Windowsのgvimの場合など。)
その他のIM切り替え方法に関しては、以下を参考にしてください。
- 日本語入力固定モード
-
'imactivatekey'
関係 - https://github.com/koron/imcsc-vim/
- Ubuntu上のVimでIME(ibus制御)
- CUIでもimaf/imsfを使いたい - Issue #444 - vim-jp/issues - GitHub
IM切り替え方法のカスタマイズをしたい場合は、
IM切り替えを行う関数を定義して、
その関数名をcontextimi_activatefunc
に設定してください
(以下の設定例も参考)。
関数の引数は'imactivatefunc'
と同じです。
IMオン/オフ切り替えを行うかどうかの判定方法のカスタマイズ
IMのオンもしくはオフが必要かを判定するための関数を定義して、
その関数名をcontextimi_decideimcfunc
に設定してください
(以下の設定例も参考)。
例えば、行末コメント中に日本語がある行で、
行頭からC
コマンドを使うとIMオンに切り替えますが、
そうではなく、IMオフに切り替えたい場合、その判定を行う関数を作成して、
contextimi_decideimcfunc
オプションに設定してください。
設定例: tcvime(1.5.0)とtutcodep keymapの場合
tcvimeはkeymap
を使うので、
tcvime#Activate()では、&iminsert
の値を1や0に設定しています。
TcvimeDecideImControl()では、
tutcodep keymapの場合、数字や一部記号はlmapオンでも直接入力可能なので、
それらの文字が書き換え対象の場合はIMをオフにしないようにしています。
(意図しない時に切り替わる可能性を減らすため。)
function! TcvimeDecideImControl(str)
if a:str =~ '[^\x00-\x7f]'
return 1
endif
" IMオフにしないと入力が面倒な文字が含まれる場合はオフにする
" tutcodep keymapの場合、数字・一部記号・一部大文字はlmapオンでも直接入力可
if a:str =~ '[^-0-9 -+:<-@[-`{-~]'
return -1
endif
return 0
endfunction
let contextimi_decideimcfunc = 'TcvimeDecideImControl'
let contextimi_activatefunc = 'tcvime#Activate'
拡張案: a
,i
,o
コマンドへの対応
現状はa
,i
,o
コマンドには未対応です。
このプラグインによるIMオン/オフ制御が、
ユーザの意図と異なる切り替えを頻繁に行うとかえって邪魔なので、
あまり意図から外れなさそうなc
,s
,r
からまず対応しています。
a
等に対応するには、カーソル前後の文字に応じて行うことになると思います。
- カーソル前後の文字が両方ともASCIIならIMオフ
- カーソル前後の文字が両方とも日本語ならIMオン
- カーソル前がASCIIで行末の場合はIMオフ
- カーソル前が日本語で行末の場合はIMオン