shift.c:changeCase always calls BufReplace[Selected],
even if not a single character has been up/downcased.
So the buffer is marked as modified even if the text is
unchanged, which is a bug IMO.
The fix is simple, just check for changes while doing
toupper/tolower - you can extract the code from patch