【问题标题】:Vim InsertLeave event doesn't occur when using CTRL-C instead of ESC使用 CTRL-C 而不是 ESC 时,Vim InsertLeave 事件不会发生
【发布时间】:2012-06-01 04:33:30
【问题描述】:

我正在阅读 Steve Losh 的 Learn Vimscript the Hard Way 并已添加到我的 .vimrc 中

" make status line red while in insert mode
augroup hi_statusline
  autocmd!
  autocmd InsertEnter * hi StatusLine ctermbg=15  ctermfg=9
  autocmd InsertLeave * hi StatusLine ctermbg=238 ctermfg=253
augroup END

不过,我注意到一个奇怪的行为。有时我点击 C-c 以退出插入模式,该模式工作正常并记录在案。当我这样做时,不会触发 InsertLeave 事件。当我使用 ESC 它工作正常。这是 vim 的一个已知的奇怪之处吗?是否有解决方法,通过挂钩另一个表明 InsertMode 不再活动的事件?

编辑 |嗯,添加一个inoremap <C-c> <ESC> 解决了它,据我所知绝对没有副作用,因为 C-c 已经做了 ESC 所做的事情(回到正常模式)。如果我错了,请纠正我。

【问题讨论】:

  • +1 for "Learn Vimscript the Hard Way) 参考,看起来很有用!
  • 真正的意思是:中止所有正在运行的操作。这包括脚本,并且自动命令是脚本。就这么简单。

标签: vim


【解决方案1】:
:ino <C-C> <Esc>

^C 通常是让我离开这里的键,如果你有一个自动命令,你需要不运行 C-C 成为你的朋友。

【讨论】:

  • 谢谢,在你发布之前也想通了这一点;)一旦 5 分钟超时过去,我会接受你的回答,所以让我这样做;)我之前在我的 vimrc 中将 Cc 映射到 ESC,但已将其删除,因为我意识到它已经支持这种行为......但显然有这种微妙之处。
  • np,accept+upvote 实际上感觉有点矫枉过正。很高兴它对你有用:-)
【解决方案2】:

这记录在:help i_CTRL-C:

CTRL-C  Quit insert mode, go back to Normal mode.  Do not check for
        abbreviations.  Does not trigger the |InsertLeave| autocommand
        event.

像往常一样,Bram 实现了设计目标。

:help design-documented

【讨论】:

    猜你喜欢
    • 2011-11-30
    • 2014-09-06
    • 2018-06-30
    • 1970-01-01
    • 2011-12-22
    • 2014-09-26
    • 2011-06-29
    • 2015-11-25
    • 2017-09-30
    相关资源
    最近更新 更多