Это, кажется, работает довольно хорошо, и делает довольно вменяемые вещи при использовании <C-a>
на 9 (95 становится 105), или <C-x>
на 0 (105 становится 95):
nnoremap g<C-a> :call search('\d', 'c')<CR>a <Esc>h<C-a>lxh
nnoremap g<C-x> :call search('\d', 'c')<CR>a <Esc>h<C-x>lxh
- Во-первых, мы ищем любую цифру,
search()
имеет преимущество не сброса @/
.
a <Esc>h
- Перейти в режим вставки, добавить пробел после цифры и перейти влево, чтобы курсор находился сверху цифры.
- Теперь мы можем использовать
<C-a>
или <C-x>
.
- Мы используем,
lxh
чтобы удалить пространство, которое мы добавили.
Я сопоставил это с g<C-a>
и g<C-x>
, так что вы все еще можете назвать оригинал.
Немного другая версия, которая будет искать только цифры в текущей строке (но оставит висячий пробел, если в текущей строке нет номера):
nnoremap g<C-a> :call search('\d', 'c', line('.'))<CR>a <Esc>h<C-a>lxh
nnoremap g<C-x> :call search('\d', 'c', line('.'))<CR>a <Esc>h<C-x>lxh
А вот еще одна версия, которая использует ту же концепцию, что и раньше, но также добавляет пробел перед цифрой. Это заставит g<C-a>
игнорировать любой знак munis перед числом (по умолчанию, <C-a>
on -42
будет увеличивать его до -41
.
Он также принимает счетчик, так что 5g<C-a>
увеличит число на 5:
fun! Increment(dir, count)
" No number on the current line
if !search('\d', 'c', getline('.'))
return
endif
" Store cursor position
let l:save_pos = getpos('.')
" Add spaces around the number
s/\%#\d/ \0 /
call setpos('.', l:save_pos)
normal! l
" Increment or decrement the number
if a:dir == 'prev'
execute "normal! " . repeat("\<C-x>"), a:count
else
execute "normal! " . repeat("\<C-a>", a:count)
endif
" Remove the spaces
s/\v (\d{-})%#(\d) /\1\2/
" Restore cursor position
call setpos('.', l:save_pos)
endfun
nnoremap <silent> g<C-a> :<C-u>call Increment('next', v:count1)<CR>
nnoremap <silent> g<C-x> :<C-u>call Increment('prev', v:count1)<CR>
10<C-a>
можете добавить 10 илиr2
заменить 1 на 2.