在暂停vim时设置光标形状

时间:2014-02-13 14:54:02

标签: vim

我在OS X 10.9之上使用iTerm2和Vim 7.4。

在我的bash shell中,我的光标是一条闪烁的线条。我已经安装了Vitality(https://github.com/sjl/vitality.vim/)以使Vim光标在正常模式下成为块,在插入模式下成为一条线。然后,为了让我的光标恢复到退出vim的一行,我已经将以下autocmd添加到我的.vimrc(来自this堆栈溢出问题):

autocmd VimLeave * let &t_me="\<Esc>]50;CursorShape=1\x7"

这一切都很有效;一个问题是,当我通过Ctrl-Z(我经常这样做)暂停Vim时,我的光标仍然是一个块。有没有办法检测到Vim被挂起(可能是通过autocmd)并将光标设置为一行?此外,大概我必须在恢复Vim时将光标重置为一个块。

2 个答案:

答案 0 :(得分:3)

暂停没有:autocmd事件,但您可以通过挂钩<C-z>命令解决此问题:

:nnoremap <silent> <C-z> :let &t_me=...<CR><C-z>

在恢复时恢复光标更加困难。看起来Vitality插件已经使用autocmd事件来改变形状,因此需要对模式进行一次模式更改(进入/退出插入模式)。

如果这还不够,你必须在上面的映射中安装一个单独的fire-once autocmd(例如在CursorMoved,CursorHold上)。或者您可以尝试通过:let发送feedkeys()命令,希望它只会在Vim唤醒后执行(未经过测试)。

答案 1 :(得分:1)

我使用Ingo的建议以及我在此处找到的内容:

Update Vim after it suspended?

...切换不同的终端设置(称为“括号粘贴模式”)时 我暂停了Vim。您可以为任何其他转义序列对调整此项 需要,因为一般概念不是BPM特定的。这个技巧解决了'fg' 问题。这是:

" (Re)Set Bracketed Paste Mode
function SetBPM(mode)
  execute "silent !echo -ne '\033[?2004" . a:mode . "'"
endfunction

" toggle BPM when suspending (hook ctrl-z)...
nnoremap <silent> <C-z> :call SetBPM("l")<CR>:suspend<bar>:call SetBPM("h")<CR>