Це, здається, працює досить добре, і робить досить розумними речі при використанні <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>
ігнорувати будь Муніс знак перед номером (за замовчуванням, <C-a>
на -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.