使用Ctrl-C退出块插入模式


8

在vim中,如果处于块插入模式(Ctrl-V, Shift-I)并使用Ctrl-C(而不是)退出Esc,它将取消块编辑(仅编辑第一行)。

为什么是这样?在几乎所有其他情况下,Ctrl-C并且Esc是同义的。(理想情况下,有一种方法可以解决此问题-我现在已经习惯了Ctrl-C,如果我必须重新学习,那真是太可惜了……)

Answers:


9

Ctrl-c并且Esc不能保证是同义词,并且经常会有所不同。例如,在“ 插入”模式下,Esc将触发缩写并进入“ 普通”模式,而Ctrl-c不会触发缩写,也不会触发InsertLeave自动命令并直接进入“ 普通”模式。另一个示例是在旧的vi命令行模式下,Esc实际上将执行命令,就好像您已经点击了Enter。Vim的故意改变了这一点,因为这种行为被认为是不直观和令人惊讶的,但你仍然可以通过添加启用它x'cpoptions'

对于逐块可视运算符,blockwise-operatorshelp标记具有以下文档:

Visual-block Insert                     *v_b_I*
With a blockwise selection, I{string}<ESC> will insert {string} at the start
of block on every line of the block, provided that the line extends into the
block.  Thus lines that are short will remain unmodified.  TABs are split to
retain visual columns.

请注意,仅Esc提及,未提及Ctrl-c

因此,不,Ctrl-c并且Esc不是等效的。放弃自己的误解永远都不可耻。一旦意识到这一点,就可以决定下一步要做什么。显而易见的选择是学习差异并使用正确的键,或者确定您不需要其中一个键的功能,然后重新映射以匹配另一个键。


4
知道了 现在,我会vnoremap <C-c> <Esc>记住您的讲话。
苏菲·阿尔珀特

@BenAlpert:实际上,您需要nnoremap一个具有相同值的inoremap才能完全像Esc一样切换到ctrl-c。多年来,我一直在像这样使用它,它对我来说非常完美。可惜的是其他vi变体(例如vile或nvi)不允许这种解决方法,因此我在这里缺少abbr功能。
Alex

0

尝试:map ^C esc通过 CTRL+ v然后CTRL+ 输入“ ^ C”的位置c


您能解释为什么这是必要的吗?它可能还有其他副作用吗?
苏菲·阿尔珀特

它们的功能略有不同。CTRL + C通常表示“取消此操作”(在类似Unix的上下文中)。在vim环境中取消该动作意味着“停止正在发生的事情并返回正常模式”。在vim中转义表示“我已经完成返回正常模式”。
donothing成功

至于副作用,我没有注意到。CTRL-C之后:!cat仍然似乎在映射后具有所需的效果。如果遇到问题,可以尝试,例如stty intr \^k在shell提示符下,将终端的中断字符更改为CTRL-k。
donothing成功地
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.