Рефакторинг в Vim

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

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

Ответ 1

Я согласен с парадигмой "Vim is a 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 (я призываю вас смотреть ВСЕ Vimcasts!). Для рефакторинга смотрите эти:

Вимгольф также отличный способ для практики.

Повсеместное распространение серверов Language Server Protocol с тех пор, как я написал этот ответ, также дало возможность рефакторинга в Vim (и других редакторах). По их мнению, они далеки от того, чтобы сравнивать возможности рефакторинга, которые вы бы видели в специально созданной IDE (я их использую, и предпочитаю coc и ALE). Смотрите другие ответы на этот вопрос для получения дополнительной информации!

Ответ 2

C-Family

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

    Предлагаемое отображение Clighter -

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

    Примечание. Последовательный плагин clighter8 удалил функцию переименования в совершить 24927db42.

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

    nmap <silent> <Leader>r :call ClampRename()<CR>
    

Ответ 3

питон

Для языка Python следующие плагины предоставляют "умные" возможности переименования для vim:

Ответ 4

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

Протокол языкового сервера содержит функцию интеллектуального переименования символов:

https://microsoft.github.io/language-server-protocol/specification#textDocument_rename

Например, следующий языковой сервер поддерживает это:

Клиент Vim Editor необходим для использования их в Vim. Существуют следующие варианты:

  1. LanguageClient-neovim (требует ржавчины) предлагает следующее сопоставление:

    nnoremap <silent> <F2> :call LanguageClient_textDocument_rename()<CR>
    
  2. coc.nvim (требуется node.js) предлагает следующее сопоставление:

    " Remap for rename current word
    nmap <leader>rn <Plug>(coc-rename)
    
  3. vim-lsp предоставляет следующую команду

    :LspRename
    

    Сопоставление не предлагается. Тем не менее, конечно, вы можете определить один из следующих

    nmap <leader>r <plug>(lsp-rename)
    

    (<leader>r должен быть заменен вашим выбором; я не знаю тот, с которым согласны большинство плагинов)

  4. vim-lsc сопоставление по умолчанию:

    'Rename': 'gR'
    

Neovim получил ожидающий (апрель 2019 г.) запрос на получение поддержки lsp из коробки:

https://github.com/neovim/neovim/pull/6856

Я не знаю, есть ли планы по протоколу lsp для поддержки более сложных рефакторингов, таких как изменение структуры класса, добавление параметров в методы/функции или перемещение метода в другой класс. Список рефакторингов см. в https://refactoring.com/catalog/.

Ответ 5

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

Ответ 6

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

Попробуйте.

Ответ 7

Фактор плагинов

Существует еще один плагин vim для рефакторинга, называемый factorus, который доступен на github.

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

  • с,
  • java и
  • питон.

Ответ 8

Плагин YouCompleteMe (YCM) (15 тыс. Звезд на github)

:h RefactorRename-new-name

RefactorRename <new name>

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

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

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

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

Ответ 9

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

Ответ 10

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

Ответ 11

Комбинация из двух плагинов: vim-ripgrep, для поиска по файлам и размещения результатов в окне быстрого исправления, и quickfix-рефлектора для сохранения изменений прямо в окне быстрого исправления и автоматического сохранения каждого изменения во всех файлах.

Ответ 12

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

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

Ответ 13

Поместите курсор на имя для рефакторинга и введите

gd (или gD, если вы проводите рефакторинг глобальной переменной).

затем

cgn new_name esc

а также

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

или же

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