![Vim:cw 和 dw 空格不一致](https://linux22.com/image/134063/Vim%EF%BC%9Acw%20%E5%92%8C%20dw%20%E7%A9%BA%E6%A0%BC%E4%B8%8D%E4%B8%80%E8%87%B4.png)
vim
cw
使用(更改单词)和dw
(删除单词)时似乎以不同的方式对待空白。
例如,对于下面的示例文本,如果光标位于字母上方a
并且我输入dw
,它将删除该单词的其余部分和后面的空格,而如果我使用cw
,它不删除空白(并按预期让您处于插入模式)。
例子:
example text
这种行为令人困惑,因为我认为无论(删除)或(更改)动词w
如何,(单词)动作都是相同的。d
c
答案1
事情就是这样,记录也是如此。如果你想cw
表现得像dw
你可以随时说
:map cw dwi
:map cW dWi
:help cw
详情请参阅。也看看w
在:help cpoptions
.
从帮助部分cw
:
特殊情况:当光标位于单词中时,“cw”和“cW”不包括单词后面的空格,它们只更改到单词末尾。这是因为 Vim 将“cw”解释为change-word,并且单词不包含后面的空格。
如果您希望“cw”在单词后面包含空格,请使用以下映射:
:map cw dwi
或者使用“caw”(参见“aw”)。
答案2
部分感谢这个答案,我找到了一种使用运算符挂起的映射来解决这种不一致的方法,保留计数。像这样的命令c3w
将按预期运行,而无需显式映射cw
、c2w
、c3w
等。操作员挂起映射的进一步说明位于链接的答案中,但本质上它附加到w
&W
动作,并且仅当前面有 时c
,它才会取消c
并执行d[count]wi
/ d[count]Wi
。我认为结果比map
文档中建议的更直观。
onoremap <expr> w <SID>ExpectedChangeWord('w', v:operator, v:count)
onoremap <expr> W <SID>ExpectedChangeWord('W', v:operator, v:count)
function! s:ExpectedChangeWord(w, op, c)
return a:op != 'c' ? a:w : "\<Esc>d" .. (a:c > 1 ? a:c : '') .. a:w .. 'i'
endfunction
我注意到的一件事是,使用单引号(如链接的答案)在旧版本的 Vim 中部分有效,但在最近的版本中根本不起作用。使用预期"\<Esc>"
的格式feedkeys()
解决了这个问题。