如何在Vim中删除一个单词并进入插入模式?

109
在正常模式下,我可以按下Ctrl + E,这将删除当前单词的其余部分并进入插入模式。
我想要删除整个单词,而不考虑光标位置(当然是在单词内)。
5个回答

194

使用"ciw"命令可以删除光标所在的单词。在Vim中,"inner"和"a"命令很方便,您也可以尝试在{}块内部输入"ci{"命令,或者加上"ca{"命令以删除{}字符。为了更好地记忆这些命令,请将它们翻译成英文: "change inner { block" 和 "change a { block"。

请参考http://vimdoc.sourceforge.net/htmldoc/motion.html#text-objects获取文档说明。


"caw" 可以替代 "ciw",具有相同的功能。 - Amjith
25
ciwcaw并不完全相同:ciw只删除单词,而caw还会删除尾部空格。 - Roberto Bonvallet
ciw在使用/something时非常好用,因为它可以替换您搜索的内容,这在我看来是非常常见的情况。感谢您的回答! - heorling
5
请使用Vim中的:help objects命令以了解更多关于这些选择方式的内容。 - Aaron
2
只是提供信息,我相信 cawca{ 中的 a 代表 "around"。 - npfoss
显示剩余2条评论

22

针对您的后续问题的答案:viwp

v    -> start visual mode
iw   -> select the 'inner word'
p    -> paste - in visual mode it replaces the visually selected text.

3
如何连续执行多次该操作?每次粘贴后,缓冲区将填充我所粘贴的单词。 - Ben Gartner
1
@BenGartner 在Vim技巧维基上发现了这个技巧:使用yiw复制当前单词,将光标放在要替换的单词上,使用ciw<C-r>0。之后,您可以将光标放在下一个单词上,并使用.来重复替换。 - siegi
@BenGartner 如果你只是想用WORD_B替换所有的WORD_A,那么你可以使用vim的ex模式,:%s/a/b/g。其中,a可以是精确文本或正则表达式,而b则是你要用来替换所有匹配到的a的内容。你可以在vim的“/”模式下测试正则表达式。如果你不想在所有行上进行替换,可以将%替换为行号或范围。 - Braden Best

8
对于第二个问题:bPldw 这将按顺序带您到当前单词的开头,在光标前插入默认寄存器,转到下一个字符(将您带过刚刚插入的文本的末尾),然后删除其余的单词。

5
这也会删除单词后面的空格。应该是 bPlde - 0x89

5
对于第一个问题,bcw 也可以使用。它的意思是“back to the begin of word,change word”。但我认为 ciw 更容易记忆,它的意思是“change inner word”,只需要一步。
对于第二个关于“使用粘贴替换”的问题,我的解决方案是 "_diwP。它会将 delete 内部单词到你不关心的寄存器中,并将默认寄存器的内容 paste。一个优点是你可以多次粘贴默认寄存器,因为它不会被污染。这有点复杂,所以我将其映射为 nnoremap ,r "_diwP

2
或者,您可以使用键序列bdwi来删除当前单词并进入插入模式。

1
你可以使用 bcw 命令将光标移动到当前单词的开头并进行修改,这会让你进入插入模式。 - Hank Gay
如果光标已经在单词的第一个字符上,那么它将会删除前一个单词。 - Warren Pena
3
在这种情况下,只需使用“dwi”即可。但要小心警察不要注意到,因为在大多数州,酒后驾车是非法的。 - Braden Best

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接