Вопрос по refactoring, vim – Рефакторинг в Vim

76

Конечно, тот факт, что вы можете выполнять рефакторинг в IDE, для многих бесценен, я почти никогда не делаю этого, когда пишу код, но я могу попытаться сделать это при редактировании чужого источника. Как вы выполняете такую тривиальную задачу для нескольких файлов в Vim?

я нашелэтот плагин для рефакторинга Ruby, но как насчет "любого" языка?

@ldigas: Это обойдет проблему. Но это совершенно не рекомендуется для некоторых языков (например, Java). В основном, код изгибается в соответствии с потребностями инструмента, тогда как на самом деле все должно быть наоборот. Merlyn Morgan-Graham
Спасибо за комментарии, я думаю, что здесь все становится сложнее, и попытка согнуть VIM в IDE не является элегантным решением для использования только одной программы для редактирования нескольких языков. Я действительно не хочу отказываться от VIM из-за некоторых «продвинутых» функций, доступных в IDE. Helmut Granda
@ MerlynMorgan-Graham - Некоторые люди просто хранят свой код в нескольких (больших, может быть) файлах. Избегает этой проблемы в целом. Rook
Рефакторинг очень зависит от языка. Вам нужно искать конкретные дополнения для каждого интересующего вас языка. Вероятно, вы найдете дополнения для одних, а не для других. Если есть тот, который вы хотите и не можете найти, тогда, если вы чувствуете себя амбициозным, вы можете попытаться написать его, используя существующую надстройку для другого похожего языка в качестве отправной точки. Steve Jorgensen
VIM предназначен для редактирования отдельных файлов, и, возможно, файлов в каталоге - непроектов, Многие рефакторинги, поддерживаемые IDE, будут влиять на файлы по всему проекту (например, переименование класса). Я думаю, что было бы сложно сделать это «правильно» с таким редактором, как (g) VI (m), до такой степени, что я думаю, что компании или крупному проекту придется взять это на себя. В основном им придется разбирать каждый язык, чтобы избежать простых подстановок строк и стать склонными к ошибкам (ctags даетнесколько из этого), а также соответствующие типы проектов (чтобы знать, какие файлы редактировать). Merlyn Morgan-Graham

Ваш Ответ

13   ответов
5

этот плагин для общего рефакторинга. Это все еще требует много улучшений. Когда-нибудь в будущем я попытаюсь отказаться от ctags в пользу clang для рефакторинга C & C ++.

0

использует те же режимы и большинство нажатий клавиш, что и Vim, но имеет гораздо больше надстроек из-за его природы шуток. Если вы хотите программировать на C ++, просто добавьте слой c ++, и большая часть IDE уже настроена для вас. Для других интерпретируемых языков, таких как python или bash, вам не нужно оставлять пробелы для их использования. У них даже есть способ запуска блоков кода непосредственно внутри вашего текста, который отлично работает для грамотного программирования или воспроизводимого программирования, где код и данные находятся в одном файле. Оба сделаны как текст.

Spacemacs намного тяжелее при начальной загрузке, но дополнительные вещи, которые вы можете сделать с ним, стоят нескольких секунд стоимости запуска. Один слой режима орг стоит проверить. Это лучший планировщик, программист, дневной таймер / список задач, которые я когда-либо использовал.

4

я используюECLIM соединить VIM и Eclipse. Конечно, все мои исходные тексты редактируются в VIM, но когда пришло время провести рефакторинг, можно воспользоваться преимуществами Eclipse в этом вопросе.

Попробуйте.

63

когда нет IDE. Вот что я использую в таких ситуациях:

: grep,: vimgrep,: Ag,: Ggrep

Рефакторинг, который больше связан с регулярными заменами, которые я обычно использую: Grep на моем дереве проекта, а затемзаписать макрос сделать рефакторинг -: g и: s нет ежу понятно. Обычно это позволяет мне быстро изменять большое количество файлов без особых усилий. Честно говоря, я использую этот метод больше, чем любой другой.

В зависимости от вашего рабочего процесса встроенные команды могут быть медленными / неудобными. Если вы используете Git, то вы хотите использовать отличныйбеглец плагин и его:Ggrep Команда только для поиска файлов, отмеченных в git. Мне тоже нравитсяСеребряный Искатель за его скорость.

: argdo,: cdo, и: bufdo

: CDO а также: argdo удобны для выполнения команд vim над набором файлов.

командная строка

Когда сложнее определить список файлов, которые нужно изменить, через:vimgrep Я прибегаю к командам командной строки grep / find, чтобы более тщательно составлять список файлов, которые мне нужны для рефакторинга. Сохраните список в текстовый файл и используйте:e и коллаж макросов для внесения необходимых изменений.

Я обнаружил, что чем меньше ржавых у меня навыков записи макросов, тем полезнее для Vim рефакторинг: удобство сохранения / восстановления из регистров, увеличение / уменьшение переменных счетчика регистров, очистка / сохранение записей макросов в файл для последующего использования и т. Д.

Обновить

Со времени написания этого видеофильмы о методах, которые я описываю, были опубликованы на vimcasts.org (я призываю вас посмотретьВСЕ Vimcasts!). Для рефакторинга смотрите эти:

Замена на: SubvertПроект широкий поиск / заменаПоиск нескольких файлов с помощью: vimgrepИспользуйте: argdo для изменения нескольких файлов

Vimgolf это также отличный способ для практики.

Существует идея практически для каждого языка. Попытка рефакторинга с помощью vim или regex звучит абсолютно безумно. Почему бы вам даже попробовать? rolls
@CutbertoOcampo Я согласен с вами в некоторой степени: в зависимости от множества аспектов проекта (структура, язык (и), навыки и ресурсы персонала и т. Д.) МОЖЕТ быть отличный инструмент рефакторинга, применимый к вашей проблеме. Мой ответ относится к ситуациям, когда это не так, и вы хотите решить проблему в Vim. dsummersl
Рефакторинг - это ПУТЬ больше, чем сопоставление с образцом, поэтому IDE необходимы для безопасной автоматизации. Очевидно, что вы можете сделать это вручную, но с учетом доступных параметров и того, что в большинстве случаев безопаснее делать это вручную, с какой стати вы бы даже рассмотрели любой другой вариант? Cutberto Ocampo
это нормально, я понимаю, что люди могут чувствовать себя более комфортно, используя свои давно предпочитаемые инструменты, и что есть некоторые хаки, которые могут работать очень хорошо, вероятно, лучше, чем любая IDE, но для Я бы сказал, что реальная среда разработки будет работать лучше для большинства пользователей. Я бы подумал о ситуации на 80-20% (даже больше, с учетом баланса в пользу IDE). Cutberto Ocampo
10
питон

питон Языковые плагины обеспечивают «умные» возможности переименования для vim:

jedi-vim (GitHub) <leader>rropevim (GitHub) CTRL-c r rpython-mode (GitHub) :h pymode-rope-refactoring
0

Unite (и вы должны), вы можете использоватьВИМ-qfreplace и сделать это чрезвычайно легко. Проверь этовидео это демонстрирует, как это работает. Как только ваш рабочий процесс настроен, вы можете сделать некоторые сопоставления для его оптимизации (вместо того, чтобы вводить большинство вещей, как в видео).

3
Протокол языкового сервера (LSP)

р.

ClangdCQueryпилс (питон)Javascript-машинопись-langserverи многое другое!

Необходим клиент редактора vim. В настоящее время существуют следующие варианты:

https://github.com/autozimu/LanguageClient-neovim который предлагает следующее сопоставление для переименования:

nnoremap <silent> <F2> :call LanguageClient_textDocument_rename()<CR>

https://github.com/prabirshrestha/vim-lsp который обеспечивает следующую команду

:LspRename

https://github.com/natebosch/vim-lsc Я не смог найти поддержку для переименования, но я ожидал, что это будет добавлено.

К сожалению, поддержка рефакторинга в LSP в настоящее время довольно слабая по сравнению с уровнем техники.github.com/Microsoft/language-server-protocol/issues/61 Mickael
12
C-Family

Clighter для переименования-рефакторинга для c-family. Он основан на Clang, но есть ограничения, и плагин помечен как устаревший.

Предлагаемое сопоставлениеClighter является

nmap <silent> <Leader>r :call clighter#Rename()<CR>

Обратите внимание, плагин-преемникclighter8 удалил функцию переименования всовершить 24927 дБ42.

Если вы используете neovim, вы можете взглянуть на плагинзажим, Предлагает

nmap <silent> <Leader>r :call ClampRename()<CR>
2
PluginТы дополняешь меня (YCM) (15 тысяч звезд на GitHub)

:h RefactorRename-new-name

RefactorRename <new name> субкоманда

В поддерживаемых типах файлов эта команда пытается выполнить семантическое переименование идентификатора под курсором. Это включает в себя переименование объявлений, определений и использования идентификатора или любое другое действие, соответствующее языку. Специфическое поведение определяется используемым семантическим механизмом.

Подобно | FixIt |, эта команда применяет автоматические изменения к вашим исходным файлам. Операции переименования могут включать изменения в нескольких файлах, которые могут быть открыты или не открываться в буферах Vim в данный момент. YouCompleteMe обрабатывает все это для вас. Поведение описано в следующем разделе.

Поддерживается в типах файлов: «javascript» (только переменные), «typcript»

По умолчанию сопоставление отсутствует. Но, конечно, вы можете определить один, если хотите.

Так что на данный момент это работает только для JavaScript, машинописи и Java? S.R
1

ринг, который я делаю, - это переименование переменных, имен классов и т. Д. Обычно я использую:bufdo :%s/source/dest/g выполнять поиск / замену в файлах, что почти совпадает с переименованием, предоставляемым большими IDE.
Однако в моем случае я обнаружил, что я обычно переименовываю похожие объекты, записанные в разных случаях (например, CamelCase, snake_case и т. Д.), Поэтому я решил написать небольшую утилиту, которая поможет с этим видом поиска в «умном случае» / заменить, это размещеноВот, Это утилита командной строки, а не плагин для vim, я надеюсь, что вы найдете ее полезной.

3
PluginFactorus

factorus который доступен наGitHub.

В настоящее время (2017-12) он поддерживает языки

с,Ява, ипитон.
-1

Г.Д. (или жеБ-г если вы рефакторинг глобальной переменной).

затем

НКЗ новое имяESC

а также

. один или несколько раз для рефакторинга следующего вхождения

или же

:%норма . провести рефакторинг всех вхождений в буфере одновременно.

0

ВИМ-ripgrep, чтобы найти по файлам и положить результаты в окне быстрого исправления, иQuickFix-отражатель сохранить изменения прямо в окне быстрого исправления и автоматически сохранять каждое изменение в файлах.

Похожие вопросы