Я использую Vim для чтения большого количества кода C и Perl, содержащего много однобуквенных имен переменных.
Было бы неплохо иметь какую-нибудь команду для изменения имени переменной на что-то более значимое, пока я читаю код, чтобы я мог быстрее прочитать остальную часть.
Есть ли в Vim какая-нибудь команда, которая позволит мне сделать это быстро?
Я не думаю, что регулярные выражения будут работать, потому что:
одно и то же однобуквенное имя может иметь разные цели в разных блоках области видимости; а также
та же комбинация букв может быть частью другого более длинного имени переменной, строкового литерала или комментария.
Есть какие-нибудь известные решения?
источник
:
дважды нажать двоеточие ( ). Первый раз нажал, увидел:'<,'>
. Если бы я просто печаталs/
оттуда, это не сработало; Мне пришлось ввести еще одно двоеточие передs/
.<C-R>
команда замены, просто пропуск поиска приведет к тому, что vim будет использовать последний найденный шаблон, который в этом случае был создан изgd
команды. Так что:s//<newname>/gc
достаточно просто делать .Я знаю, что это старый вопрос, и способ @mykola-golubyev, очевидно, является лучшим ответом для конкретного случая в вопросе OP (который, я полагаю, проходит через запутанный код, где у вас, вероятно, будет несколько блоков с одинаковыми именами var) ; но с таким названием вопроса многие люди, приходящие сюда из поисков Google, вероятно, ищут менее зависящие от ситуации способы переименования переменных в VIM - и они могут быть более краткими
Я удивлен, что никто не предложил такой способ:
То
*
же, что иgn
- он ищет следующее вхождение слова под курсором и становится последним искомым шаблоном, поэтому, когда вы опускаете шаблон поиска в команде замены, VIM предполагает, что это шаблон для поиска.Для небольшого количества копий var еще более быстрый:
Поиск вхождения,
cw
это команда для изменения слова ,n
переходит к следующему вхождению последнего искомого термина и.
повторяет последнюю команду (которая представляет собой изменение слова на NEWNAME )(Благодарности за то, что я все это знаю, идут на @doomedbunnies на Reddit )
Еще один крутой трюк: ( кредиты на @ nobe4 )
cgn
это «изменить то, что является результатом (найти следующее вхождение)». Теперь, когда это последняя команда , вам не нужноn
переходить к следующему вхождению, поэтому снова меньше штрихов и, что более важно, нет необходимости чередоватьn
и.
. Но, очевидно, у этого есть недостаток, заключающийся в том, что у него нет возможности пропустить событие.Вот некоторые преимущества:
*
илиgn
для выбора слова выполняется очень быстро - всего одно нажатие клавиши (ну, скажем, 1,5)*
илиgn
убедитесь, что вы не найдете совпадений внутри других слов, как и:%s/<C-R>//gc
делает. Лучше печатать:%s/\<OLDNAME\>/NEWNAME/gc
от руки: лично я часто забываю использовать\<
вещи, чтобы ограничить совпадение только целыми словами.n
чтобы пропустить нежелательные совпадения - возможно, даже меньше, чем дополнительные штрихи, необходимые для ограничения области действия. В обычных условиях ваши переменные, скорее всего, так или иначе локализованы для определенного блока кода.источник
AFAIK, в VIM нет реальной поддержки рефакторинга. При переименовании с целью рефакторинга я обычно принимаю следующие меры предосторожности:
Мое окончательное изменение выглядит примерно так
Я хотел бы ошибиться в том, что для VIM не существует инструмента рефакторинга, но я его не видел.
источник
Поместите это в свой .vimrc
Назовите это с
:call Rnvar()
expand("<cword>")
получает слово под курсором. Строка поиска использует%
для файла-сферы, а также\(\W\)
шаблоны поиска символов без слов на границе слова , чтобы заменить, и сохранять их в переменных\1
и\2
так, чтобы быть повторно вставлен в шаблоне замены.источник
Вы можете использовать модификатор «c» в глобальном поиске и замене, который будет запрашивать подтверждение для каждой замены. Это займет больше времени, но может сработать для небольшого файла кода:
C означает подтверждение.
источник
В c вы можете добиться некоторого прогресса с помощью cscope. Он пытается понять синтаксис, поэтому у него будет шанс узнать, когда буква была переменной.
источник
Если это связано с несколькими файлами, вы можете подумать о том, чтобы взглянуть на sed. Используйте find для получения файлов и xargs плюс sed для замены. Скажем, вы хотите заменить a на a_better_name во всех файлах, соответствующих * .c, вы можете сделать
найти . -name "* .c" | xargs sed -i -e 's / a / a_better_name / g'
Имейте в виду, что это заменит ВСЕ вхождения a, поэтому вам может потребоваться более надежное регулярное выражение.
источник