Bem, primeiro, sinto-me obrigado a mencionar que existe um site dedicado às perguntas do vim ...
Dito isto, há algumas maneiras diferentes de conseguir isso. Uma maneira seria usar o "registro de avaliação" no seu comando substituto. Isso ficaria assim:
:%s/-\+/\=repeat('=', len(submatch(0)))
Essencialmente, isso está dizendo:
Replace one or more dashes with '=' repeated n times, where n is the number of dashes.
Essa é a maneira mais direta e óbvia, mas é um pouco desajeitada / detalhada, o que é típico de comandos substitutos usando o registro de avaliação.
Você também pode fazer isso com o comando global. Isso seria algo como isto:
:g/^-\+$/norm Vr=
Essencialmente, isso está dizendo:
On every line containing nothing but dashes, type
Vr=
as if I had typed it myself.
V
selecionará visualmente a linha inteira e r=
substituirá a seleção inteira por caracteres '='.