Esto parece funcionar bastante bien, y hace cosas bastante sensatas cuando se usa <C-a>
en un 9 (95 se convierte en 105), o <C-x>
en un 0 (105 se convierte en 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
- Primero, buscamos cualquier dígito,
search()
tiene la ventaja de no reiniciar @/
.
a <Esc>h
- Vaya al modo de inserción, agregue un espacio después del dígito y vaya a la izquierda para que el cursor esté en la parte superior del dígito.
- Ahora podemos usar
<C-a>
o <C-x>
.
- Usamos
lxh
para eliminar el espacio que agregamos.
He asignado esto a g<C-a>
y g<C-x>
, por lo que aún puede llamar al original.
Una versión ligeramente diferente que solo buscará números en la línea actual (pero dejará un espacio colgante si no hay un número en la línea actual):
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
Y aquí hay otra versión que usa el mismo concepto que antes, pero también agrega un espacio antes del dígito. Esto hará g<C-a>
caso omiso de cualquier signo munis antes del número (por defecto, <C-a>
en la -42
voluntad 'incremento' a -41
.
También acepta un recuento, por lo que 5g<C-a>
incrementará el número en 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>
agregar 10 or2
reemplazar el 1 con un 2.