Questo sembra funzionare abbastanza bene e fa cose abbastanza sane quando si usa <C-a>
un 9 (95 diventa 105) o si usa <C-x>
uno 0 (105 diventa 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
- Innanzitutto, cerchiamo qualsiasi cifra,
search()
ha il vantaggio di non reimpostare @/
.
a <Esc>h
- Passa alla modalità di inserimento, aggiungi uno spazio dopo la cifra e vai a sinistra in modo che il cursore si trovi sulla parte superiore della cifra.
- Ora possiamo usare
<C-a>
o <C-x>
.
- Usiamo
lxh
per rimuovere lo spazio che abbiamo aggiunto.
Ho mappato questo su g<C-a>
e g<C-x>
, quindi puoi ancora chiamare l'originale.
Una versione leggermente diversa che cercherà solo i numeri sulla riga corrente (ma lascerà uno spazio penzolante se non ci sono numeri sulla riga corrente):
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
Ed ecco un'altra versione che utilizza lo stesso concetto di prima, ma aggiunge anche uno spazio prima della cifra. Questo farà g<C-a>
ignorare qualsiasi segno di munis prima del numero (per impostazione predefinita, <C-a>
su -42
lo "incrementerà" a -41
.
Accetta anche un conteggio, quindi 5g<C-a>
aumenterà il numero di 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>
per aggiungere 10 or2
sostituire 1 con un 2.