Help us understand the problem. What is going on with this article?

`c`,`s`,`r`コマンドで、書き換え前の文字列に応じてIMオン/オフを切り替えるVimプラグインを作りました

More than 5 years have passed since last update.

c,s,rコマンドで、書き換え前の文字列に応じてIMオン/オフを切り替えるVimプラグインを作りました

Vim Advent Calendar 2013の92日目(2014-03-02)の記事です。

普段はtutcode keymapを使って日本語を入力しているのですが、
ソースコード編集時に、
関数名書き換え等の際にたびたび日本語入力をオフにする操作を
していることに気づきました。

書き換え前の関数名はASCII文字しか使っていないので、
こういう場合は最初から日本語入力はオフにしておいて欲しい、
と思ったのでプラグインcontextimi.vimを作りました。

以下の機能を提供します。

  • ASCII文字列をcsrで書き換える際は、IMをオフに切り替え
  • 日本語文字列をcsrで書き換える際は、IMをオンに切り替え

使い始めたばかりですが、今のところほとんど違和感なく使えています。
("ASCIIで"を"日本語で"に書き換えようとすると
IMオフになっていらつくことはありました。
書き換え前の文字列に加えて、その前後の文字まで見る方がいいのかも)

IMのオン/オフの切り替え制御

IMのオン/オフの切り替え制御は、デフォルトでは
&iminsertの値を2や0に設定することで行います。(Windowsのgvimの場合など。)

その他のIM切り替え方法に関しては、以下を参考にしてください。

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をオフにしないようにしています。
(意図しない時に切り替わる可能性を減らすため。)

.vimrc
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オン

関連

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした