v(lowercase) ends visual mode if mode is visual character-wise. This allows it to cycle through visual modes: visual -> visual-block -> visual-line -> visual
xnoremap <expr> v
\ (mode() ==# 'v' ? "\<C-V>"
\ : mode() ==# 'V' ? 'v' : 'V')