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 \0uma substituição comum, submatch(1)é equivalente a \1etc. Isso, infelizmente, consome muitas teclas.
Para mais informações sobre a substituição expressão, tipo :help sub-replace-expression.