Конечно, возможность рефакторинга в IDE бесценна для многих, я почти никогда не делаю этого, когда пишу код, но я могу попытаться сделать это при редактировании чужого источника. Как выполнить такую тривиальную задачу с несколькими файлами в Vim?
Я нашел этот плагин для рефакторинга Ruby, но как насчет «любого» языка?
vim
refactoring
Гельмут Гранда
источник
источник
Ответы:
Я согласен с парадигмой «Vim - это не IDE». Но бывают случаи, когда IDE нет. Вот что я использую в таких ситуациях:
: grep,: vimgrep,: Ag,: Ggrep
Рефакторинг, который больше связан с регулярными заменами, я обычно использую : grep в моем дереве проекта, а затем записываю макрос для выполнения рефакторинга -: g и: s - это не проблема. Обычно это позволяет мне быстро изменять большое количество файлов с минимальными усилиями. Честно говоря, я использую этот метод больше, чем любой другой.
В зависимости от вашего рабочего процесса встроенные команды могут быть медленными / неудобными. Если вы используете git, вы захотите использовать отличный плагин Fugitive и его
:Ggrep
команду для поиска только файлов, проверенных в git. Еще мне нравится Silver Searcher за его скорость.: argdo,: cdo и: bufdo
: cdo и : argdo удобны для выполнения команд vim над набором файлов.
командная строка
Когда становится труднее определить список файлов, требующих изменений,
:vimgrep
я прибегаю к командам командной строки grep / find для более тщательного анализа списка файлов, которые мне нужно реорганизовать. Сохраните список в текстовый файл и используйте:e
мэшап записей макросов, чтобы внести необходимые изменения.Я считаю, что чем менее ржавыми я сохраняю свои навыки записи макросов, тем более полезным я нахожу Vim для рефакторинга: комфортно сохранять / восстанавливать из регистров, увеличивать / уменьшать переменные счетчика регистров, очищать / сохранять записи макросов в файл для последующего использования и т. Д.
Обновить
С момента написания этой статьи на vimcasts.org было опубликовано больше видеопередач с описанными мною методами (я призываю вас посмотреть ВСЕ Vimcast! ). Для рефакторинга посмотрите эти:
Вимгольф - также отличный способ практиковаться.
Повсеместное распространение серверов протокола языкового сервера с тех пор, как я написал этот ответ, также принесло некоторую возможность рефакторинга в Vim (и другие редакторы). ИМО, они далеки от того, чтобы уравнять возможности рефакторинга, которые вы могли бы увидеть в специально созданной среде IDE (я использую их и предпочитаю coc и ALE). Смотрите другие ответы на этот вопрос для получения дополнительной информации!
источник
Протокол языкового сервера (LSP)
Протокол языкового сервера содержит функцию интеллектуального переименования символов в проекте:
https://microsoft.github.io//language-server-protocol/specifications/specification-3-14/#textDocument_rename
Например, следующий языковой сервер поддерживает это:
Вы можете найти другие языковые серверы по адресу https://langserver.org/ .
Vim
Клиент-редактор vim необходим для использования их в vim. Существуют следующие варианты:
LanguageClient-neovim (требуется ржавчина) предлагает отображение:
coc.nvim (требуется node.js) предлагает сопоставление:
Ale имеет
Ale не определяет никаких сочетаний клавиш. Это должен делать пользователь.
vim-lsp предоставляет следующую команду
Как и в случае с Ale, отображение не предлагается. Однако, конечно, вы можете определить его следующим образом
(
<leader>r
должен быть заменен на ваш выбор; я не знаю, с чем согласны большинство плагинов)vim-lsc имеет сопоставление по умолчанию:
См. Также YouCompleteMe, который также поддерживает LSP.
Неовим
Neovim имеет начальную встроенную поддержку lsp с 13.11.2019
См. Общие конфигурации LSP на https://github.com/neovim/nvim-lsp
Однако я не мог понять, как работает умное переименование. Если кто-то знает это, обновите этот раздел.
Другие рефакторинги
Я не знаю, есть ли в планах протокол LSP для поддержки более сложных рефакторингов, таких как изменение структуры класса, добавление параметров к методам / функциям или перемещение метода в другой класс. Список рефакторингов см. На https://refactoring.com/catalog/ .
источник
coc-rename
работает только с текущим буфером. Он не обновлял использование экспортированного имени глобально в проекте (в файлах).Python
Для языка Python следующие плагины предоставляют «умные» возможности переименования для vim:
jedi-vim
( гитхаб )<leader>r
ropevim
( гитхаб )CTRL-c r r
python-mode
( гитхаб ):h pymode-rope-refactoring
источник
C-Семья
Попробуйте плагин Clighter для переименования-рефакторинга для семейства c. Он основан на clang, но есть ограничения, и плагин помечен как устаревший.
Предлагаемое сопоставление Clighter :
Обратите внимание, что преемник плагина clighter8 удалил функцию переименования в коммите 24927db42 .
Если вы используете neovim, вы можете взглянуть на зажим плагина . Это предполагает
источник
Я написал этот плагин для общего рефакторинга. Он по-прежнему требует многих улучшений. Когда-нибудь в будущем я постараюсь отказаться от ctags в пользу clang для рефакторинга C и C ++.
источник
Плагин YouCompleteMe (YCM) (20к звезд на github)
http://ycm-core.github.io/YouCompleteMe/#the-refactorrename-new-name-subcommand
По умолчанию сопоставление отсутствует.
источник
Возможно, не самое элегантное решение, но оно мне показалось очень удобным: я использую ECLIM для подключения VIM и Eclipse. Конечно, все мое редактирование исходного кода выполняется в VIM, но когда пришло время провести рефакторинг, можно воспользоваться превосходными возможностями Eclipse в этом вопросе.
Попробуйте.
источник
Плагин Factorus
Существует еще один плагин vim, предназначенный для рефакторинга, под названием factorus, который доступен на github .
В настоящее время (2017-12) он поддерживает языки
источник
Поместите курсор на имя для рефакторинга и введите
gd(или gDесли вы выполняете рефакторинг глобальной переменной).
затем
cgn новое имя esc
а также
. один или несколько раз для рефакторинга следующего вхождения (й)
или
:%norm . для одновременного рефакторинга всех вхождений в буфере.
источник
Я пишу много кода C / C ++ в vim. Наиболее распространенный рефакторинг, который я выполняю, - это переименование переменных, имен классов и т. Д. Обычно я использую
:bufdo :%s/source/dest/g
поиск / замену в файлах, что почти то же самое, что и переименование, предоставляемое большими IDE.Однако в моем случае я обнаружил, что обычно переименовываю похожие сущности, написанные в разных регистрах (например, CamelCase, snake_case и т. Д.), Поэтому я решил написать небольшую утилиту, чтобы помочь с таким поиском «умных» случаев / заменить, он размещен здесь . Это утилита командной строки, а не плагин для vim, надеюсь, вы найдете ее полезной.
источник
Для рефакторинга, если вы используете Unite (а вы должны это делать ), вы можете затем использовать vim-qfreplace и упростить его. Посмотрите это видео, которое демонстрирует, как это работает. Как только ваш рабочий процесс настроен, вы можете сделать некоторые сопоставления для его оптимизации (вместо того, чтобы вводить большинство вещей, как в видео).
источник
Комбинация двух плагинов: vim-ripgrep , чтобы находить файлы и помещать результаты в окно quickfix, и quickfix-отражатель, чтобы сохранять изменения прямо в окне quickfix и автоматически сохранять каждое изменение в файлах.
источник
Я бы подумал об использовании версии emacs для spacemacs. Он использует те же режимы и большинство нажатий клавиш, что и Vim, но имеет гораздо больше надстроек из-за его шепелявого характера. Если вы хотите программировать на C ++, вы просто добавляете слой C ++, и большая часть IDE уже настроена для вас. Для других интерпретируемых языков, таких как python или bash, вам не нужно оставлять spacemacs, чтобы использовать их. У них даже есть способ запускать блоки кода прямо в вашем тексте, что отлично подходит для грамотного программирования или воспроизводимого программирования, когда код и данные находятся в одном файле. Оба сделаны как текст.
Spacemacs гораздо тяжелее справляется с начальной загрузкой, но дополнительные вещи, которые вы можете с ним сделать, стоят нескольких секунд затрат на запуск. Однослойный орг-режим стоит попробовать. Это лучший планировщик, программист, дневник / список дел, который я когда-либо использовал.
источник
Идти
Существует плагин vim https://github.com/godoctor/godoctor.vim, который делает их доступными
энергично
:GoRename
.Языковой сервер
gopls
источник