Điều này dường như hoạt động khá tốt và thực hiện những điều khá lành mạnh khi sử dụng <C-a>
trên 9 (95 trở thành 105) hoặc sử dụng <C-x>
trên 0 (105 trở thành 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
- Đầu tiên, chúng tôi tìm kiếm bất kỳ chữ số nào,
search()
có lợi thế là không đặt lại @/
.
a <Esc>h
- Chuyển đến chế độ chèn, thêm khoảng trắng sau chữ số và sang bên trái để con trỏ ở trên cùng của chữ số.
- Bây giờ chúng ta có thể sử dụng
<C-a>
hoặc <C-x>
.
- Chúng tôi sử dụng
lxh
để loại bỏ không gian chúng tôi thêm vào.
Tôi đã ánh xạ cái này đến g<C-a>
và g<C-x>
, vì vậy bạn vẫn có thể gọi bản gốc.
Một phiên bản hơi khác sẽ chỉ tìm kiếm các số trên dòng hiện tại (nhưng sẽ để lại một khoảng trống lơ lửng nếu không có số nào trên dòng hiện tại):
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
Và đây là một phiên bản khác sử dụng khái niệm tương tự như trước đây, nhưng cũng thêm một khoảng trắng trước chữ số. Điều này sẽ làm g<C-a>
bỏ qua bất kỳ dấu hiệu munis trước số (theo mặc định, <C-a>
vào -42
ý chí 'tăng' nó sang -41
.
Nó cũng chấp nhận số đếm, do đó 5g<C-a>
sẽ tăng số lượng lên 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>
để thêm 10 hoặcr2
thay thế 1 bằng 2.