Isso parece funcionar muito bem e faz coisas razoavelmente sensatas ao usar <C-a>
um 9 (95 se torna 105) ou usar <C-x>
um 0 (105 se torna 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
- Primeiro, procuramos por qualquer dígito,
search()
tem a vantagem de não redefinir @/
.
a <Esc>h
- Vá para o modo de inserção, adicione um espaço após o dígito e vá para a esquerda para que o cursor fique na parte superior do dígito.
- Agora podemos usar
<C-a>
ou <C-x>
.
- Usamos
lxh
para remover o espaço que adicionamos.
Eu mapeei isso para g<C-a>
e g<C-x>
, assim você ainda pode chamar o original.
Uma versão ligeiramente diferente, que procurará apenas números na linha atual (mas deixará um espaço pendente se não houver número na linha atual):
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
E aqui está outra versão que usa o mesmo conceito de antes, mas também adiciona um espaço antes do dígito. Isso fará com que g<C-a>
ignorar qualquer sinal munis antes do número (por padrão, <C-a>
na -42
vontade 'incremento' para -41
.
Ele também aceita uma contagem, de modo que 5g<C-a>
aumentará o número em 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>
para adicionar 10 our2
para substituir a 1 com um 2.