Você pode :set virtualedit+=onemore
, que permite que você passe apenas pelo último caractere. Infelizmente para você, $
ainda vai para o último caractere; você tem que passar o cursor para passar por ele. Por outro lado, você pode usar g$
, que normalmente vai para o último caractere da linha tela em uma linha que envolve; no modo onemore
, também passa o último caractere de uma linha não encapsulada (ou a última linha de uma linha envolvida).
:h 'virtualedit'
diz que essa opção pode atrapalhar os scripts, mas não sei qual é o tamanho do risco na realidade.