Есть несколько подходов, которые можно предпринять. Если вы хотите придерживаться базовой функциональности Vim, вы можете сделать что-то вроде
:%s/[uU]ser/\=submatch(0) ==# 'user' ? 'person' : 'Person'/g
. Если у вас Vim, построенный с привязками Perl, вы можете использовать : perldo
. В зависимости от длины совпадающих / заменяемых слов и от того, в каком регистре вы хотите сохранить, это может работать или не работать.
:perldo s/(user)/"\L$1" ^ $1 ^ 'person'/ieg
Или вы можете использовать один из различных скриптов реализующие такую функциональность.
Переделал ответ, немного подумав; -)
:s@\([Uu]\)ser@\=((submatch(1)=="U")?"P":"p")."erson"@gc
Конечно, его можно улучшить, но идея остается.