VIM: Как сохранить регистр для поиска и замены

Возможный дубликат:
Замену замены в Vim

Можно ли выполнить поиск и заменить в vim, который сохраняет случай поиска? Это была полезная функция в intelliJ, которую я пропускаю.

Например, что-то вроде:

:s/[uU]ser/[pP]erson/ (obviously, this doesn't work)

Таким образом:

user->person
User->Person

Другой пример с несколькими символами для сохранения:

:s/[mM]y[uU]ser/[tT]his[pP]erson/g

Таким образом:

myuser->thisperson
myUser->thisPerson
MyUser->ThisPerson

Ответ 1

Существует несколько подходов, которые можно предпринять. Если вы хотите придерживаться базовой функциональности Vim, вы можете сделать что-то вроде

:%s/[uU]ser/\=submatch(0) ==# 'user' ? 'person' : 'Person'/g

Если вы создали Vim с привязками к Perl, вы можете использовать :perldo. В зависимости от длины совпадающих/замещающих слов и того места, где вы хотите сохранить, это может работать или не работать.

:perldo s/(user)/"\L$1" ^ $1 ^ 'person'/ieg

Или вы можете использовать один из различные scripts, которые реализуют такие функции.

Ответ 2

Повторить ответ после некоторого раздумья; -)

:[email protected]\([Uu]\)[email protected]\=((submatch(1)=="U")?"P":"p")."erson"@gc

Конечно, его можно улучшить, но идея остается.

Ответ 3

Там есть плагин для vim: keepcase.vim