我怎样才能在 Vim 中 'change in number' 或 'change in digits'

How can I 'change in number' or 'change in digits' in Vim

我经常在 Vim 中编辑 CSS,需要更改如下值:

width: 300px;

其他类似的东西:

width: 178px;

通常我所做的是导航到 300 中的 3,然后键入 cw 来更改单词。但是如果我这样做,我必须再次输入 px 位。有没有一种简短快捷的方式来表达 change in digits.

在我的搜索中,我发现 Ctrl-a 和 Ctrl-x 可以在这种情况下递增和递减数字。是否有能够重新输入数字的等效项?

我应该澄清一下,理想的解决方案是在操作时需要最少的击键,并支持修改不同长度的数字。比如我想把 300px 改成 17px。

如果您只想将该行的 300 更改为 178,请执行以下操作:

:s/300/178/ RETURN

它将在当前行

上执行查找->替换

要在全球范围内执行此操作,请执行:

:%s/300/178/g RETURN

我不知道 "change in digits" 命令,但你可以使用 t,它类似于 f,但会转到你要搜索的字符之前;也就是说,如果您键入 tp,它会将光标移动到您所在行中 "p" 之前的字符。将它与 c 组合,如果您的光标在 3 上,ctp178 Esc 会将 300 替换为 178。

或者,您可以使用 3s 替换接下来的三个字符:3s178 Esc。当被替换的字符串很容易扫描长度时,这很容易。如果您的替换文本与被替换文本的长度相同,您可以只使用 R 来替换:R178 Esc.

这是 in,一个自定义文本对象,可让您对数值(包括浮点数)进行操作:

" custom text-object for numerical values
function! Numbers()
    call search('\d\([^0-9\.]\|$\)', 'cW')
    normal v
    call search('\(^\|[^0-9\.]\d\)', 'becW')
endfunction
xnoremap in :<C-u>call Numbers()<CR>
onoremap in :normal vin<CR>

实际搜索是在一个函数中执行的,以避免破坏搜索寄存器和搜索突出显示。

您可以将该文本对象添加到您的 vimrc "as is" 并像其他文本对象一样使用它:

vin
cin
yin
din

--- 编辑 ---

这个新版本:

  • 不会干扰搜索突出显示(很好),
  • 不会混淆搜索寄存器(好),
  • 尊重 BOL 和 EOL(好),
  • 适用于花车(好)。

欢迎评论。

--- 编辑 ---

我最喜欢的方式是使用视觉模式,所以我会导航到 3,然后使用 2 个空格(或任何其他动作命令)导航到我想要更改的部分的末尾。突出显示要更改的部分后,只需键入 s178 即可用字符“178”替换突出显示的部分。

您可以使用 romainl 提出的文本对象,或者依赖现有的对象: