vim ではモードが重要です。特にノーマルモードとインサートモードの 2 つは、現在自分がどちらにいるのかを常に把握していないといけません。
以前紹介した Powerline はステータスバーを目立たせることでこれを実現していました。
【Vim】Powerline でリッチなステータスラインを使う – blog.delphinus.dev
https://blog.delphinus.dev/2012/01/vim-powerline.html
このプラグインは非常に優れものですが一つ問題がありました。目立つのは画面最下部ですので、インサートモード時に視点が向いているであろう、カーソル付近でモードを知る術がないのです。
カーソル行の色を変える
そこで、まずはカーソルのある行の色を変えることで目立たせてみます。
" カーソル行を強調表示しない set nocursorline " 挿入モードの時のみ、カーソル行をハイライトする autocmd InsertEnter,InsertLeave * set cursorline!
後は、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 はこれを受けて次のようにカーソルの形を変化させます。
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 でカーソルの色を変える機能が付いています。これと、上で紹介しました、カーソル行の色を変える機能で何とかしのいでいます。