Você deve usar getpos():
Para salvar sua posição em uma variável:
let save_pos = getpos(".")
getpos()toma como argumento uma marca, aqui "."representa a posição atual do seu cursor.
E para restaurá-lo:
call setpos('.', save_pos)
Aqui, o primeiro argumento indica que você moverá a marca da posição atual do seu cursor (daí a sua posição atual) e o segundo é onde colocar a marca (a posição que você salvou anteriormente).
Sua função ficaria assim:
function! DollarSplit()
let save_pos = getpos(".")
normal! 6|r$ " replaces the 6th caracter in line with a $
call setpos(".", save_pos)
endfunction
Para mais detalhes, consulte: :h getpos()e:h setpos()
Para mais detalhes sobre o uso de execute: esta função pega uma string e a executa. Sua cadeia pode ter apenas caracteres codificados entre aspas duplas ou o conteúdo de variáveis.
Quando você escreve
execute col_number."|"
Se você estiver na 12ª coluna, a string expandida será 12|. Execute tentará executar este comando, mas não funcionará porque 12|não é uma função vimscript, mas um comando no modo normal.
Para executá-lo a partir de um vimscript, você deve dizer "execute-o como se eu o tivesse digitado no modo normal", é para isso que o normal é usado.
Portanto, sem a execução, você teria escrito:
normal 12|
Agora, para fazer sua executeligação funcionar, você deve adicionar a normalpalavra-chave à sua cadeia expandida, assim:
execute "normal " . col_number . "|"