Vim:cw 和 dw 空格不一致

Vim:cw 和 dw 空格不一致

vimcw使用(更改单词)和dw(删除单词)时似乎以不同的方式对待空白。

例如,对于下面的示例文本,如果光标位于字母上方a并且我输入dw,它将删除该单词的其余部分后面的空格,而如果我使用cw,它删除空白(并按预期让您处于插入模式)。

例子:

example text

这种行为令人困惑,因为我认为无论(删除)或(更改)动词w如何,(单词)动作都是相同的。dc

答案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将按预期运行,而无需显式映射cwc2wc3w等。操作员挂起映射的进一步说明位于链接的答案中,但本质上它附加到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()解决了这个问题。

相关内容