You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让Vim识别带下划线的数字格式并正确执行增减操作?

解决Vim带下划线数字的增减问题

Vim默认的<C-a>/<C-x>不会把下划线当作数字分隔符,所以才会出现你遇到的问题——只识别1_000_000里的1,导致10<C-x>后变成-9_000_000。可以通过自定义函数+映射的方式解决:

  • 第一步,在你的~/.vimrc(或Neovim的init.vim)里添加这个处理函数:
function! AdjustUnderscoreNumber(amt)
    " 匹配光标所在的带下划线数字(支持123、123_456、123_456_789格式)
    let num_str = matchstr(getline('.'), '\d\+_\d\+_\d\+\|\d\+_\d\+\|\d\+', col('.') - 1)
    if num_str == ''
        " 不是带下划线的数字就执行默认增减操作
        execute "normal! " . a:amt . (a:amt > 0 ? "\<C-a>" : "\<C-x>")
        return
    endif
    " 去掉下划线转成整数计算
    let num = str2nr(substitute(num_str, '_', '', 'g')) + a:amt
    " 给计算后的数字重新加下划线分隔符(每三位一个)
    let new_num_str = substitute(reverse(substitute(reverse(string(num)), '\d\d\d', '&_', 'g')), '^_', '', '')
    " 替换原行的数字
    call setline('.', substitute(getline('.'), num_str, new_num_str, ''))
endfunction
  • 第二步,添加映射覆盖默认快捷键:
nnoremap <C-a> :call AdjustUnderscoreNumber(1)<CR>
nnoremap <C-x> :call AdjustUnderscoreNumber(-1)<CR>
xnoremap <C-a> :call AdjustUnderscoreNumber(v:count1)<CR>
xnoremap <C-x> :call AdjustUnderscoreNumber(-v:count1)<CR>

设置完成后,再对1_000_000执行10<C-x>,就能得到999_990;普通数字的增减操作也不受影响。

内容的提问来源于stack exchange,提问作者Peter R

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 16:43:16