除了每输入一个字符的同时会删除一个字符外,Vim替换模式和插入模式类似。如果到达行尾,Vim 把其后新输入的字符插入在行尾,这时的操作和插入模式下相同完全相同。在替换模式下,按退格键恢复原来已经被替换的文本。

一、Vim替换模式

Vim普通模式下输入 R 命令进入替换模式。

如果所用的键盘上有 Insert 键,那么也可以用该键在插入模式和替换模式间切换。这点与在word、notepad++等编辑器中按 Insert 键进入替换模式是完全一致的。

在替换模式下,当前光标下的单个字符会逐渐被新输入的字符所替换。如果没有字符可以替换了(到了行尾),新输入的字符会插入到行尾 (和插入模式一样)。

vim replace mode

:Vim普通模式下输入 r 只是会用接下来的一个字符替换当前光标下的字符,但仍然处在普通模式下。

1.1 替换模式下的删除

如果在替换模式下删除字符 (用退格键 BackSpace 或 Vim组合命令 <ctrl-w><ctrl>-u),实际发生的事是删除了新输入的字符,而被替换的字符又被复原了。当然,超过已有字符长度的新输入部分,执行删除操作时新增的字符直接被删除了。

Vim替换模式删除

如果打开了 expandtab 选项,Tab 键会用多个空格替换一个字符。如果在替换模式下新输入了 Tab 键,那么行内的字符数增加了。退格键 Backspace 只能一次删一个空格。原来的字符只有在最后一个空格上退格才能回得来。

<ctrl-w><ctrl>-u 命令的更多介绍,请阅读Vim插入模式实用技巧

1.2 替换模式下的特殊字符

一些特殊字符会使替换模式变得复杂化。以制表符 Tab 为例,在文件中它以单个字符表示,但在屏幕上它却会占据若干列的宽度,此宽度由 tabstop 设置决定 (参见Vim自动缩进配置、原理和tab键替换空格)。

如果把光标移到制表符上,然后进入替换模式,那么新输入的下一个字符将会替换整个制表符。假设 tabstop 选项被设置为缺省值 8,那么该操作的结果就是把 8个字符替换成了一个字符,这将大幅缩短当前行的长度。

为了很好地解决特殊字符在替换模式下可能出现的问题,Vim提供了另外一种替换模式——虚拟替换模式。

二、虚拟替换模式

在普通模式里输入 gR 命令进入虚拟替换模式。

:虚拟替换模式只有在编译Vim时加入了 +vreplace 特性才会有效,Vi 没有虚拟替换模式。

在Vim虚拟替换模式下,制表符会被当成一组空格进行处理。假设我们把光标移到一个占屏幕 8 列宽的制表符上,然后切换到虚拟替换模式,在输入前 7 个字符时,每个字符都会被插入到制表符之前;最后,当输入第 8 个字符时,该字符才会替换制表符。

虚拟替换模式是按屏幕上实际显示的宽度来替换字符,而不是按文件中所保存的字符进行替换。这会减少意外情况的发生,因此建议在可能的情况下尽量使用虚拟替换模式,而不是普通的替换模式。

和替换模式一样,在虚拟替换模式下使用 Backspace 等按键进行删除操作时会恢复被替换的字符。

类似于与 R 命令的单次版本命令 rgR 命令也提供了单次版本的命令 grr{char}gr{char} 命令允许新输入一个字符来覆盖当前字符后马上又切换回普通模式。

为了更好地理解替换模式和虚拟替换模式的概念,推荐阅读Vim光标移动之实际行与屏幕行

嗯,扫一扫就可以找到小女子我啦~