【vim】インサートモードでカーソルを目立たせる


vim ではモードが重要です。特にノーマルモードインサートモードの 2 つは、現在自分がどちらにいるのかを常に把握していないといけません。

以前紹介した Powerline はステータスバーを目立たせることでこれを実現していました。

【Vim】Powerline でリッチなステータスラインを使う – blog.delphinus.dev
https://blog.delphinus.dev/2012/01/vim-powerline.html

このプラグインは非常に優れものですが一つ問題がありました。目立つのは画面最下部ですので、インサートモード時に視点が向いているであろう、カーソル付近でモードを知る術がないのです。

カーソル行の色を変える

そこで、まずはカーソルのある行の色を変えることで目立たせてみます。

" カーソル行を強調表示しない
set nocursorline
" 挿入モードの時のみ、カーソル行をハイライトする
autocmd InsertEnter,InsertLeave * set cursorline!
2012-10-20_155400.png

ノーマルモード
2012-10-20_155420.png

インサートモード

後は、hi CursorLine の設定してあるカラースキームを使いましょう。サンプル画像では Solarized を使っています。

カーソルの形状を変える(GVim 編)

GVim では set guicursor でカーソルの形状を変えることができます。というか、標準でそうなっていますよね。

カーソルの形状を変える(vim 編)

厄介なのはコンソールの vim です。これは各人の環境によって方法が変わってきます。

iTerm2 の場合

iTerm2 はエスケープシーケンスによってカーソルの形を変えることができます。

let &t_SI = "\e]50;CursorShape=1\x7"
let &t_EI = "\e]50;CursorShape=0\x7"

vim により、t_SI はインサートモード開始時、t_EI はインサートモード終了時にキーが発行されます。iTerm2 はこれを受けて次のようにカーソルの形を変化させます。

121020-0001.png

ノーマルモード
121020-0002.png

インサートモード

iTerm2 + Screen の場合

iTerm2 上で Screen を使っていると、エスケープシーケンスが Screen に取られてしまってうまくいきません。こういうときは Screen のエスケープシーケンスでこれを囲むとうまくいきます。

let &t_SI = "\eP\e]50;CursorShape=1\x7\e\\"
let &t_EI = "\eP\e]50;CursorShape=0\x7\e\\"

\eP\e\\ で囲まれた部分が iTerm2 に渡されるわけです。

Screen 上で vim を使っているかどうかを自動的に認識するには &term を参照して切り替えると良いです。

if &term =~ "screen"
  let &t_SI = "\eP\e]50;CursorShape=1\x7\e\\"
  let &t_EI = "\eP\e]50;CursorShape=0\x7\e\\"
elseif &term =~ "xterm"
  let &t_SI = "\e]50;CursorShape=1\x7"
  let &t_EI = "\e]50;CursorShape=0\x7"
endif

Putty(DW)の場合

Putty ではこれがうまくいきません。エスケープシーケンスによってカーソルの形を変える機能が搭載されていないのです。Putty は派生版が多くあるソフトですから、中には使えるものもあるかもしれませんが、僕が常用している D2D/DW Putty では無理っぽいです。

その代わりと言っては何ですが、D2D/DW Putty には IME ON/OFF でカーソルの色を変える機能が付いています。これと、上で紹介しました、カーソル行の色を変える機能で何とかしのいでいます。

この辺は Tera Term がやはり強いです。エスケープシーケンス次第で色んなことができるみたいですね。

コメントを残す