Wydaje się, że działa to całkiem dobrze i robi całkiem rozsądne rzeczy, gdy używa się <C-a>
na 9 (95 staje się 105), lub używa <C-x>
na 0 (105 staje się 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
- Po pierwsze, szukamy dowolnej cyfry,
search()
ma tę zaletę, że nie resetuje się @/
.
a <Esc>h
- Przejdź do trybu wstawiania, dodaj spację po cyfrze i idź w lewo, aby kursor znajdował się nad cyfrą.
- Możemy teraz użyć
<C-a>
lub <C-x>
.
- Używamy
lxh
do usuwania dodanego miejsca.
Odwzorowałem to na g<C-a>
i g<C-x>
, więc nadal możesz zadzwonić do oryginału.
Nieco inna wersja, która będzie wyszukiwać tylko liczby w bieżącym wierszu (ale pozostawi wiszącą spację, jeśli w bieżącym wierszu nie ma numeru):
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
A oto kolejna wersja, która wykorzystuje tę samą koncepcję jak poprzednio, ale dodaje również spację przed cyfrą. Spowoduje to g<C-a>
zignorowanie dowolnego znaku munis przed liczbą (domyślnie, <C-a>
on -42
„zwiększy” ją do -41
.
Akceptuje również liczenie, więc 5g<C-a>
zwiększy liczbę o 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>
dodać 10 lubr2
zamienić 1 na 2.