key-bindings – Como Ctrl-A y Ctrl-X pero modifica solo el primer dígito

Pregunta:

¿Hay alguna manera de aumentar / disminuir el primer dígito después / debajo del cursor, no el número entero?

Sé que no es así como funciona vim, pero ¿hay algún complemento que lo haga? No pude encontrarlo.

Es muy útil a la hora de editar CSS y en otros casos también.

Dado:

▐margin: 10px

Cuando presiono CTRL-A quiero ver:

▐margin: 20px

Real:

▐margin: 11px

Respuesta:

Esto parece funcionar bastante bien y hace cosas bastante sensatas cuando se usa <Ca> en un 9 (95 se convierte en 105), o se usa <Cx> 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 restablecer @/ .
  • 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é encima del dígito.
  • Ahora podemos usar <Ca> o <Cx> .
  • Usamos lxh para eliminar el espacio que agregamos.

He asignado esto a g<Ca> y g<Cx> , 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 ningún 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á que g<Ca> ignore cualquier signo de munis antes del número (por defecto, <Ca> en -42 lo 'incrementará' a -41 .

También acepta un recuento, por lo que 5g<Ca> 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>

Leave a Comment

Your email address will not be published.

Scroll to Top

istanbul avukat

-

web tasarım