I wouldn't call it a bug. Looking at
:h ge this is said:
ge Backward to the end of word [count] inclusive.
Now let's see what inclusive means
A character motion is either inclusive or exclusive. When inclusive, the
start and end position of the motion are included in the operation. When
exclusive, the last character towards the end of the buffer is not
included. Linewise motions always include the start and end position.
This means, that ge will always include the character further to the beginning of the document, e.g. where the cursor jumps to. You can force it to be exclusive using the
v modifier (
:h o_v). But that means in this case only that the starting point will be excluded from the operation.
I gues what what you want, is something more like this map:
:onoremap <silent> <leader>ge :norm! ge <cr>
This will make it exclusive to the char where the cursor jumps to (e.g. the beginning of the visual selection). If you want both ends to be exclusive, you can use this mapping:
:onoremap <silent> <leader>ge :norm! vge oh<cr>
Note, that both mappings depend on your
'selection' option to be at the default of
inclusive. For a truly robust mapping, you would have to save and restore that option and use a mapping that works under a defined option value.
If you want the mapping make use of a count, something like this should do it. (For better understandability let's make use of a function):
return "\<c-u>:norm! ".v:count1."ge "
onoremap <leader>ge :<c-u><c-r>=MyCustomGE()<cr><cr>
This way you can use
ge for the standard Vim behaviour and
<Leader>ge for your special case. See
:h <Leader> for the Leader key (default backslash)