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


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

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

12 73

12 ответов:

Я согласен с парадигмой "Vim-это не IDE". Но бывают случаи, когда нет IDE. Вот что я использую в таких ситуациях:

: grep,: vimgrep,: Ag,: Ggrep

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

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

: argdo,: cdo, и: bufdo

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

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

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

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


обновление

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

Vimgolf - это также отличный способ, чтобы практиковать.

C-Family

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

    предложил картографии по Clighter и

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

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

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

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

Python

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

  • jedi-vim (github)<leader>r
  • ropevim (github)CTRL-c r r
  • python-mode (github):h pymode-rope-refactoring

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

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

дайте ему попробовать.

плагин Factorus

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

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

  • c,
  • java, и
  • python.

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

выделенный языковой сервер позволяет также переименовывать. Е. Г.

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

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

    nnoremap <silent> <F2> :call LanguageClient_textDocument_rename()<CR>
    
  2. https://github.com/prabirshrestha/vim-lsp который обеспечивает следующую команду

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

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

плагин YouCompleteMe (YCM) (15K звезд на github)

:h RefactorRename-new-name

The RefactorRename <new name> команда

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

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

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

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

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

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

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

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