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

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

78 голосов
/ 09 января 2012

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

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

Ответы [ 13 ]

63 голосов
/ 09 января 2012

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

: grep,: vimgrep,: Ag,: Ggrep

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

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

: argdo,: cdo и: bufdo

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

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

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

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


Обновление

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

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

12 голосов
/ 20 августа 2014

C-Family

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

    Рекомендуемое отображение Clighter равно

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

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

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

    nmap <silent> <Leader>r :call ClampRename()<CR>
    
10 голосов
/ 21 августа 2015

Python

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

5 голосов
/ 25 марта 2013

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

4 голосов
/ 27 июля 2017

Протокол языкового сервера (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/.

4 голосов
/ 09 мая 2013

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

Дайте ему попытку.

3 голосов
/ 27 июля 2017

Плагин Фактор

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

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

  • с
  • Java и
  • питон.
2 голосов
/ 06 декабря 2017

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

:h RefactorRename-new-name

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

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

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

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

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

1 голос
/ 03 ноября 2013

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

0 голосов
/ 18 ноября 2018

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

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

Тогда

cgn new_name esc

и

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

или

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...