如何让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
相关产品推荐
相关产品推荐

