The single most intuitive ah-ha moment I’ve had in Vi was the change verb. Change In <object>: ci( means “change the text within parentheses.” Change unTil <object>: ct& means “change the text until an ampersand.” And so on. It just makes sense.
VSCode never had moments like that for me. It’s fine, sure, but it wasn’t anything special.
You may love to learn then: Those aren't part of change.
"i(" is a selector (see ":help object-select"), and it also works with "y" or "d" or even in visual mode. Likewise "t" is a movement that can even be used on its own.
There's also a sibling to "i", "a", that includes the delimiter used, and "t" is a valid delimiter for HTML or XML tags.
No, it isn't, but that's perhaps the point: it's so direct. It rarely gets in the way. Sure, some things are easier done in emacs, but that's when you just copy the text to emacs, do your thing, and copy it back.
What VSCode isn't, is elegant. I think the OP likes that very much, and VSCode has forsaken that in favor of simplicity and a kind of free-for-all extension mechanism.
VSCode never had moments like that for me. It’s fine, sure, but it wasn’t anything special.