Isso pode ser feito com :help :map-expr
mappings para todos os caracteres minúsculos que verificam o final de uma frase anterior. Se houver um caractere de finalização de frase antes do cursor, ele retornará o caractere maiúsculo, caso contrário, o caractere minúsculo digitado.
Você pode forçar um caractere minúsculo após um caractere de finalização de frase pressionando Shift enquanto digita o caractere. Ou seja, com efeito, o caso é "alternado" para a primeira letra.
Eu uso um loop para criar os mapeamentos individuais:
for char in split('abcdefghijklmnopqrstuvwxyz', '\zs')
exe printf("inoremap <expr> %s search('[.!?]\_s\+\%%#', 'bcnw') ? '%s' : '%s'", char, toupper(char), char)
endfor
for char in split('ABCDEFGHIJKLMNOPQRSTUVWXYZ', '\zs')
exe printf("inoremap <expr> %s search('[.!?]\_s\+\%%#', 'bcnW') ? '%s' : '%s'", char, tolower(char), char)
endfor