É claro que o fato de você poder refatorar em IDEs não tem preço para muitos. Quase nunca faço isso quando estou codificando, mas posso tentar fazer isso ao editar o código-fonte de outra pessoa. Como você realiza uma tarefa tão trivial em vários arquivos no Vim?
Eu encontrei este plugin para refatorar Ruby, mas que tal "qualquer" linguagem?
vim
refactoring
Helmut Granda
fonte
fonte
Respostas:
Eu concordo com o paradigma 'Vim não é um IDE'. Mas às vezes não há um IDE. Aqui está o que eu uso nessas situações:
: grep,: vimgrep,: Ag,: Ggrep
Refatoração que tem mais a ver com substituições regulares que eu geralmente uso : grep na minha árvore de projeto e, em seguida, registro uma macro para fazer a refatoração -: ge: s não são brainers. Normalmente, ele permite que eu modifique rapidamente um grande número de arquivos com muito pouco esforço. Honestamente, eu uso esse método mais do que qualquer outro.
Dependendo do seu fluxo de trabalho, os comandos integrados podem ser lentos / inconvenientes. Se você usa git, então você vai querer usar o excelente plugin Fugitive e seu
:Ggrep
comando para pesquisar apenas arquivos registrados no git. Também gosto do Silver Searcher por sua rapidez.: argdo,: cdo e: bufdo
: cdo e : argdo são úteis para executar comandos do vim em um conjunto de arquivos.
linha de comando
Quando é mais difícil determinar a lista de arquivos que precisam de alterações por meio,
:vimgrep
eu recorro aos comandos grep / find da linha de comando para selecionar mais de perto a lista de arquivos que preciso refatorar. Salve a lista em um arquivo de texto e use:e
um mashup de gravações de macro para fazer as alterações que preciso fazer.Eu acho que quanto menos enferrujado mantenho minhas habilidades de gravação de macro, mais útil eu acho o Vim para refatoração: me sentindo confortável salvando / restaurando de registros, incrementando / diminuindo variáveis de contador de registro, limpando / salvando gravações de macro em arquivo para uso posterior, etc.
Atualizar
Desde que escrevi este, mais videocasts para os métodos que descrevo foram publicados no vimcasts.org (eu encorajo você a assistir TODOS os Vimcasts! ). Para refatoração, observe estes:
Vimgolf também é uma ótima maneira de praticar.
A onipresença dos servidores Language Server Protocol desde que escrevi esta resposta também trouxe alguma capacidade de refatoração para o Vim (e outros editores). IMO, eles estão muito longe de igualar a capacidade de refatorar recursos que você veria em um IDE construído para um propósito (eu os uso e prefiro COC e ALE). Veja outras respostas nesta questão para mais informações!
fonte
Language Server Protocol (LSP)
O protocolo do servidor de linguagem contém o recurso para renomeação inteligente de símbolos em um projeto:
https://microsoft.github.io//language-server-protocol/specifications/specification-3-14/#textDocument_rename
Por exemplo, o servidor de idioma a seguir oferece suporte para isso:
Você pode encontrar mais servidores de idiomas em https://langserver.org/ .
Vim
Um cliente de editor vim é necessário para usá-los dentro do vim. Existem as seguintes opções:
LanguageClient-neovim (requer ferrugem) sugere o mapeamento:
coc.nvim (requer node.js) sugere o mapeamento:
Ale tem
Ale não define atalhos de teclado. Isso deve ser feito pelo usuário.
vim-lsp fornece o seguinte comando
Semelhante ao Ale, nenhum mapeamento é sugerido. No entanto, é claro que você pode definir um da seguinte forma
(
<leader>r
deve ser substituído por sua escolha; não conheço um com o qual a maioria dos plug-ins concorde)vim-lsc tem um mapeamento padrão:
Veja também YouCompleteMe, que também facilita os LSPs.
Neovim
Neovim tem suporte integrado inicial para lsp desde 13.11.2019
Consulte para configurações comuns de LSPs https://github.com/neovim/nvim-lsp
No entanto, não consegui descobrir como funciona a renomeação inteligente. Se alguém souber disso, atualize esta seção.
Outras Refatorações
Não sei se existem planos para o protocolo LSP suportar refatorações mais complexas, como alterar a estrutura de classe, adicionar parâmetros a métodos / funções ou mover um método para uma classe diferente. Para obter uma lista de refatorações, consulte https://refactoring.com/catalog/ .
fonte
coc-rename
só funciona no buffer atual. Ele não atualizou o uso do nome exportado globalmente no projeto (entre arquivos).Pitão
Para a linguagem python , os seguintes plug-ins fornecem recursos de renomeação 'inteligentes' para o vim:
jedi-vim
( github )<leader>r
ropevim
( github )CTRL-c r r
python-mode
( github ):h pymode-rope-refactoring
fonte
Família C
Experimente o plugin Clighter para renomear-refatoração para a família c. É baseado no clang, mas existem limitações e o plugin está marcado como obsoleto.
O mapeamento sugerido por Clighter é
Observe, o plug-in sucessor clighter8 removeu a funcionalidade de renomeação no commit 24927db42 .
Se você usa o neovim, pode dar uma olhada no grampo do plugin . Sugere
fonte
Escrevi este plugin para refatoração genérica. Ainda requer muitas melhorias. Em algum momento no futuro, tentarei abandonar os ctags em favor do clang para refatorações de C e C ++.
fonte
Talvez não seja a solução mais elegante, mas achei muito útil: eu uso ECLIM para conectar o VIM e o Eclipse. É claro que toda a edição do meu código-fonte é feita no VIM, mas quando é hora de refatorar, pode-se tirar vantagem das capacidades superiores do Eclipse neste assunto.
De uma chance.
fonte
Plugin Factorus
Existe outro plugin vim dedicado para refatoração chamado factorus que está disponível no github .
Atualmente (2017-12), ele suporta os idiomas
fonte
Plugin YouCompleteMe (YCM) (20 mil estrelas no github)
http://ycm-core.github.io/YouCompleteMe/#the-refactorrename-new-name-subcommand
Por padrão, não há mapeamento.
fonte
Coloque o cursor no nome para refatorar e digitar
gd(ou gDse você estiver refatorando uma variável global).
Então
cgn novo nome esc
e
. uma ou mais vezes para refatorar próxima (s) ocorrência (s)
ou
:%norm . para refatorar todas as ocorrências no buffer de uma vez.
fonte
Eu escrevo muito código C / C ++ no vim. A refatoração mais comum que faço é renomear variáveis, nomes de classes, etc. Normalmente, costumo
:bufdo :%s/source/dest/g
fazer uma pesquisa / substituição em arquivos, o que é quase o mesmo que renomear fornecido por grandes IDE.No entanto, no meu caso, descobri que geralmente renomeio entidades semelhantes, escritas em casos diferentes (ou seja, CamelCase, snake_case, etc.), então decidi escrever um pequeno utilitário para ajudar com esse tipo de pesquisa de "caso inteligente" / substitua, está hospedado aqui . É um utilitário de linha de comando, não um plug-in para o vim, espero que seja útil para você.
fonte
Para refatorar, se você estiver usando o Unite (e deveria), você pode usar o vim-qfreplace e torná-lo extremamente fácil. Confira este vídeo que demonstra como funciona. Depois que seu fluxo de trabalho estiver definido, você pode fazer alguns mapeamentos para otimizá-lo (em vez de digitar a maioria das coisas, como no vídeo).
fonte
Uma combinação de dois plug-ins: vim-ripgrep , para localizar arquivos e colocar os resultados na janela de correção rápida, e quickfix-reflector para salvar as alterações diretamente na janela de correção rápida e salvar automaticamente cada alteração nos arquivos.
fonte
Eu consideraria usar a versão spacemacs do emacs. Ele usa os mesmos modos e a maioria dos pressionamentos de tecla que o Vim, mas tem muitos outros add-on por causa de sua natureza lisp. Se você deseja programar em C ++, basta adicionar a camada C ++ e a maior parte do IDE já está configurada para você. Para outras linguagens interpretadas como python ou bash, você não precisa deixar o spacemacs para usá-los. Eles ainda têm uma maneira de executar blocos de código diretamente no seu texto, o que funciona de forma fantástica para programação literária ou reproduzível, onde o código e os dados estão no mesmo arquivo. Ambos feitos como texto.
O Spacemacs é muito mais pesado em sua carga inicial, mas as coisas adicionais que você pode fazer com ele valem os poucos segundos de custo inicial. Vale a pena conferir o modo org de uma camada. É o melhor delineador, programador, cronômetro diário / lista de tarefas que já usei.
fonte
Ir
Existe um plugin do vim https://github.com/godoctor/godoctor.vim que os torna disponíveis
vim-go
:GoRename
.Servidor de idioma
gopls
fonte