Vim

根据模式改变光标类型

我(原作者)习惯在普通模式下用块状光标,在插入模式下用条状光标(形状类似英文 "I" 的样子),然后在替换模式中使用下划线形状的光标。

if empty($TMUX)
  let &t_SI = "\<Esc>]50;CursorShape=1\x7"
  let &t_EI = "\<Esc>]50;CursorShape=0\x7"
  let &t_SR = "\<Esc>]50;CursorShape=2\x7"
else
  let &t_SI = "\<Esc>Ptmux;\<Esc>\<Esc>]50;CursorShape=1\x7\<Esc>\\"
  let &t_EI = "\<Esc>Ptmux;\<Esc>\<Esc>]50;CursorShape=0\x7\<Esc>\\"
  let &t_SR = "\<Esc>Ptmux;\<Esc>\<Esc>]50;CursorShape=2\x7\<Esc>\\"
endif

原理很简单,就是让 VIM 在进入和离开插入模式的时候,输出一些序列,请参考 escape sequence。VIM 与终端之间的中间层,比如 tmux 会处理并执行上面的代码。

但上面这个还是有一个缺点的。终端环境的内部原理不尽相同,对于序列的处理方式也稍有不同。因此,上面的代码可能无法在你的环境中运行。甚至,你的运行环境也有可能不支持其他光标形状,请参阅你的 VIM 运行环境的文档。好消息是,上面这个代码,可以在 iTerm2 中完美运行。