A maneira mais fácil de lidar com isso é provavelmente chamar uma função definida pelo usuário. Eu fiz a seguinte prova de conceito. Algumas desvantagens:
Se você usar abreviações em vez de mapeamentos, o caractere digitado após a abreviação que o aciona será incluído como parte do texto capturado do usuário pela chamada input()
, por isso usei um mapeamento.
O problema com um mapeamento é que quando você digita um > ele não aparecerá no arquivo até que você digite algo que diga ao Vim que você não está tentando acionar o mapeamento (ou espere o tempo suficiente para que a detecção do mapeamento atinja o tempo limite).
imap <expr> >>> MyHeader('=')
function! MyHeader(fillchar)
let l:text = input("Header Text: ")
let l:len = ((&tw ? &tw : 79) - len(text) - 2) / 2
let l:fill = repeat(a:fillchar, l:len)
return l:fill . ' ' . l:text . ' ' . l:fill
endfunction
Como esta é apenas uma prova de conceito, não tentei aperfeiçoá-la. Por exemplo, a largura do cabeçalho pode ser "off by one" se o número de caracteres no texto do cabeçalho ou o textwidth
for um número ímpar. Vou deixar para você corrigir isso e adicionar outros refinamentos que você quiser.