我怎样才能在 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 提出的文本对象,或者依赖现有的对象:
我经常在 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 提出的文本对象,或者依赖现有的对象: