Just to chime in, if you really really want a single key - you can still use ... another one (i.e. a key that you don't need that much)! In this way you can leave the useful
g prefix alone.
For example, you can "overload"
0 to toggle between
^ functionality, when repeatedly pressed, and free
^ instead for your usage (since it's an intuitive go up character).
I'm sure this is not perfect, but here's a possible quick-n-dirty proof of concept:
if (a:mode == 'x')
let sp = col('.')
let ep = col('.')
if (sp == ep)
nnoremap <silent> 0 :<c-u>call ToStartOrNonBlankToggle('n')<cr>
onoremap <silent> 0 :<c-u>call ToStartOrNonBlankToggle('o')<cr>
xnoremap <silent> 0 :<c-u>call ToStartOrNonBlankToggle('x')<cr>
noremap <silent> ^ gg
The above still allows using 0 as motion, and also from visual mode. On an indented line,
y0 would now copy from cursor position to the first non-blank character. If you want to copy to the start column instead, you'll have to go visual:
You can now also use
13^ to go to line 13.