Para fazer o que você quer, não há como escrever uma função e mapear suas chaves preferidas.
Para começar, :echo synIDattr(synID(line("."), col("."), 1), "name")
imprimirá o nome do grupo de destaque da palavra atual sob o cursor.
Você pode usar essas informações para determinar qual estilo de comentário usar.
Um exemplo aproximado para você começar:
function! s:MyComment () range
for i in range(a:firstline, a:lastline)
exe "normal " . i . "gg"
normal ^
let stuff = synIDattr(synID(line("."), col("."), 1), "name")
if strpart(stuff, 0, 4) == "html"
normal I<!--
normal A -->
else
normal I//
endif
endfor
endfunction
vmap <silent> . :call <SID>MyComment()<CR>