Ini tampaknya bekerja dengan cukup baik, dan melakukan hal-hal yang cukup waras ketika menggunakan <C-a>
angka 9 (95 menjadi 105), atau menggunakan <C-x>
angka 0 (105 menjadi 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
- Pertama, kami mencari digit apa pun,
search()
memiliki keuntungan tidak mengatur ulang @/
.
a <Esc>h
- Pergi ke mode insert, tambahkan spasi setelah digit, dan pergi ke kiri sehingga kursor berada di atas digit.
- Kita sekarang dapat menggunakan
<C-a>
atau <C-x>
.
- Kami menggunakan
lxh
untuk menghapus ruang yang kami tambahkan.
Saya telah memetakan ini ke g<C-a>
dan g<C-x>
, jadi Anda masih dapat memanggil yang asli.
Versi yang sedikit berbeda yang hanya akan mencari angka pada baris saat ini (tetapi akan meninggalkan ruang yang menggantung jika tidak ada angka di baris saat ini):
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
Dan inilah versi lain yang menggunakan konsep yang sama seperti sebelumnya, tetapi juga menambahkan spasi sebelum digit. Ini akan membuat g<C-a>
mengabaikan tanda munis sebelum nomor (secara default, <C-a>
pada -42
akan 'bertambah' menjadi -41
.
Itu juga menerima hitungan, sehingga 5g<C-a>
akan menambah angka dengan 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>
dapat menambahkan 10 ataur2
mengganti 1 dengan 2.