Existe uma maneira de aumentar / diminuir o primeiro dígito após / sob o cursor, não o número inteiro.
Eu sei que não é assim que o vim funciona, mas existe um plugin que faz isso? Não consegui encontrar.
É muito útil ao editar css e também em outros casos.
Dado:
▐margin: 10px
Quando pressiono CTRL-A
, quero ver:
▐margin: 20px
Real:
▐margin: 11px
key-bindings
arithmetic
firedev
fonte
fonte
10<C-a>
para adicionar 10 our2
para substituir a 1 com um 2.Respostas:
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):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.<C-a>
ou<C-x>
.lxh
para remover o espaço que adicionamos.Eu mapeei isso para
g<C-a>
eg<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):
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:fonte
Incremento básico
Aqui está uma macro simples para executar a ação:
No modo normal, você
m`
Marque sua localizaçãol
mover um caractere para a direitav$x
corte até o final da linhah
voltar para a posição original<c-a>
incremento (ou decremento)p
cole de volta o seu corte``
volte para a sua marcaIr para o próximo número
Se você quiser pular para o próximo número (ou permanecer na sua posição atual, se estiver em um número), precisará de uma função que verifique o caractere atual e o possível salto para o próximo número.
NextNum
coloca o caractere sob o cursor, verifica se é um número e se não procura o próximo número. Depois disso, o resto é o mesmo. Se você deseja que o mapeamento seja diferente, basta alterarnnoremap <leader>a
para o que deseja, por exemplonnoremap <c-a>
.Ignorando negativos e números maiores que 9
Se você deseja apenas percorrer os dígitos e não fazê-los agir como números inteiros assinados, as seguintes funções serão incrementadas, decrementadas e roladas em 0 e 9.
Agora, quando você está ligado
8
e digita,<leader>a
recebe9
. Fazê-lo novamente resulta em0
. Se você pressionar<leader>x
em0
que você começa9
. O mesmo vale para números negativos. As funções cortam um único caractere, aumentam, diminuem ou passam o mouse e colam no lugar.fonte
<c-a>/<c-x>
também.<c-a>
e<c-x>
para outra coisa, porque o comportamento padrão não é tão útil.<c-a>
e<c-x>
muito. Sempre que eu atualizar uma versão ou aumentar uma variável de intervalo, apenas em[N]<c-a>
vez de excluir e substituir.<c-a>
e<c-x>
precisa ser descartada para uma função que faz o mesmo, mas ignora o traço.Aqui está uma versão que escrevi usando uma expressão substituta:
Cada um apenas procura o primeiro dígito caractere da linha e adiciona ou subtrai um se estiver no intervalo [0-8] ou [1-9], respectivamente. Tem três problemas:
"/
e se você tiver o hlsearch ativado, todos os números no buffer atual serão destacados quando você o usar. Você pode anexar:noh<CR>
a cada um dosmap
comandos acima para interromper o realce, mas não sei como impedir que o registro seja derrotado.Além disso, se fosse eu, eu traçaria o item acima para
<leader>a
e<leader>x
, em vez de paraCTRL-A/X
. Dessa forma, você tem os dois comportamentos disponíveis para você.<leader>
é, por padrão, a tecla de barra invertida (\
).fonte
:noh
também. Mas o problema real é que ele não pode usar a posição do cursor como base e, portanto, você pode incrementar apenas o primeiro dígito da linha.noremap
) e nuncamap
. Veja esta página para uma explicação mais detalhada disso.