Faça cálculos com o registro de expressão
Você pode fazer cálculos no modo normal e no modo de inserção.
Modo normal
No modo normal, se você digitar, @=
o cursor se moverá para a linha de comando, onde é possível inserir qualquer expressão. Quando você pressiona enter, o resultado da expressão será executado como comandos no modo normal.
Por exemplo, suponha que você queira ir para a coluna do meio da linha atual. A chamada de função col('$')
retorna o número de colunas na linha, para que possamos realizar o que, digitando o seguinte:
@=col('$')/2<CR>|
Quando você pressiona enter, o cursor retorna ao buffer e o vim aguarda um operador (como |
) como se você tivesse acabado de inserir um número. Como alternativa, você poderia ter digitado isso:
@=col('$')/2.'|'
... mas é claro que são mais bytes.
Modo de inserção
Você também pode usar o registro de expressão no modo de inserção pressionando em <Ctrl-r>=
vez de @=
. Funciona da mesma maneira no modo normal, exceto que o resultado da expressão inserida será executado no modo de inserção. Por exemplo, se você digitou <Ctrl-r>=col('$')<CR>
, o número de colunas na linha atual seria inserido no cursor como se você a tivesse digitado.
Para obter mais informações sobre o registro de expressão, digite :help "=
.
Reutilizando expressões
A última expressão que você usou é armazenada no registro de expressões "=
,. Digitar @=<CR>
no modo normal ou <Ctrl-r>=<CR>
no modo de inserção avaliará a expressão novamente, permitindo que você as use de maneira semelhante às macros.
Faça cálculos em substituições
Você também pode avaliar expressões ao fazer substituições de expressões regulares. Tudo o que você precisa fazer é iniciar sua substituição \=
. Por exemplo, suponha que você deseje numerar as linhas neste arquivo:
foo
bar
baz
A chamada de função line('.')
retorna o número da linha atual, facilitando o trabalho. Inserindo isso:
:s/^/\=line('.').' '/g<CR>
... produz o resultado desejado:
1 foo
2 bar
3 baz
Para usar grupos capturados em uma expressão como essa, você pode usar a submatch()
função, onde, por exemplo, submatch(0)
é equivalente a \0
uma substituição comum, submatch(1)
é equivalente a \1
etc. Isso, infelizmente, consome muitas teclas.
Para mais informações sobre a substituição expressão, tipo :help sub-replace-expression
.