Bien sûr, le fait que vous puissiez refactoriser sur les IDE n'a pas de prix pour beaucoup, je ne le fais presque jamais lorsque je codifie mais je peux essayer de le faire lors de l'édition de la source de quelqu'un d'autre. Comment accomplissez-vous une tâche aussi triviale sur plusieurs fichiers dans Vim?
J'ai trouvé ce plugin pour refactoriser Ruby, mais qu'en est-il de "n'importe quel" langage?
vim
refactoring
Helmut Granda
la source
la source
Réponses:
Je suis d'accord avec le paradigme «Vim n'est pas un IDE». Mais il y a des moments où il n'y a pas d'IDE. Voici ce que j'utilise dans ces situations:
: grep,: vimgrep,: Ag,: Ggrep
Refactoring qui a plus à voir avec les remplacements réguliers que j'utilise habituellement : grep sur mon arbre de projet, puis enregistre une macro pour faire le refactor -: g et: s ne sont pas des idées. Habituellement, cela me permet de modifier rapidement un grand nombre de fichiers avec très peu d'effort. Honnêtement, j'utilise cette méthode plus que toute autre.
En fonction de votre flux de travail, les commandes intégrées peuvent être lentes / peu pratiques. Si vous utilisez git, vous voudrez utiliser l'excellent plugin Fugitive et sa
:Ggrep
commande pour rechercher uniquement les fichiers archivés dans git. J'aime aussi le Silver Searcher pour sa rapidité.: argdo,: cdo et: bufdo
: cdo et : argdo sont pratiques pour exécuter des commandes vim sur un ensemble de fichiers.
ligne de commande
Lorsqu'il est plus difficile de déterminer la liste des fichiers qui nécessitent des modifications,
:vimgrep
je recourt aux commandes de ligne de commande grep / find pour organiser plus étroitement la liste des fichiers que je dois refactoriser. Enregistrez la liste dans un fichier texte et utilisez:e
un mashup d'enregistrements de macros pour apporter les modifications que je dois apporter.Je trouve que moins je garde mes compétences d'enregistrement de macros, plus je trouve Vim utile pour la refactorisation: se sentir à l'aise pour enregistrer / restaurer des registres, incrémenter / décrémenter les variables de compteur de registre, nettoyer / enregistrer des enregistrements de macro dans un fichier pour une utilisation ultérieure, etc.
Mettre à jour
Depuis l'écriture de ces vidéos, d'autres vidéos pour les méthodes que je décris ont été publiées sur vimcasts.org (je vous encourage à regarder TOUS les Vimcasts! ). Pour refactoriser, regardez ceux-ci:
Vimgolf est également un excellent moyen de pratiquer.
L'omniprésence des serveurs Language Server Protocol depuis que j'ai écrit cette réponse a également apporté une certaine capacité de refactoring à Vim (et à d'autres éditeurs). IMO, ils sont loin d'être égaux à la capacité de refactorisation des capacités que vous verriez dans un IDE spécialement conçu (je les utilise et je préfère coc et ALE). Voir les autres réponses à cette question pour plus d'informations!
la source
Protocole de serveur de langue (LSP)
Le protocole du serveur de langue contient la fonctionnalité permettant de renommer intelligemment les symboles dans un projet:
https://microsoft.github.io//language-server-protocol/specifications/specification-3-14/#textDocument_rename
Par exemple, le serveur de langue suivant prend en charge ceci:
Vous pouvez trouver plus de serveurs de langues sous https://langserver.org/ .
Vigueur
Un client éditeur vim est nécessaire pour les utiliser dans vim. Les options suivantes existent:
LanguageClient-neovim (nécessite rust) suggère le mappage:
coc.nvim (nécessite node.js) suggère le mappage:
Ale a
Ale ne définit aucune combinaison de touches. Cela doit être fait par l'utilisateur.
vim-lsp fournit la commande suivante
Semblable à Ale, aucune cartographie n'est suggérée. Cependant, bien sûr, vous pouvez en définir un comme suit
(
<leader>r
doit être remplacé par votre choix; je n'en connais pas sur lequel la plupart des plugins sont d'accord)vim-lsc a un mappage par défaut:
Voir aussi YouCompleteMe qui facilite également les LSP.
Neovim
Neovim a un support intégré initial pour lsp depuis le 13.11.2019
Consultez les configurations courantes des LSP https://github.com/neovim/nvim-lsp
Cependant, je ne pouvais pas comprendre comment fonctionne le changement de nom intelligent. Si quelqu'un le sait, veuillez mettre à jour cette section.
Autres refactorisations
Je ne sais pas s'il est prévu que le protocole LSP prenne en charge des refactorisations plus complexes, telles que la modification de la structure de classe, l'ajout de paramètres aux méthodes / fonctions ou le déplacement d'une méthode vers une classe différente. Pour une liste des refactorisations, voir https://refactoring.com/catalog/ .
la source
coc-rename
ne fonctionne que sur le tampon actuel. Il n'a pas mis à jour l'utilisation du nom exporté globalement dans le projet (entre les fichiers).Python
Pour le langage python , les plugins suivants fournissent des capacités de renommage `` intelligentes '' pour vim:
jedi-vim
( github )<leader>r
ropevim
( github )CTRL-c r r
python-mode
( github ):h pymode-rope-refactoring
la source
Famille C
Essayez le plugin Clighter pour renommer-refactoring pour la famille c. Il est basé sur clang, mais il y a des limitations et le plugin est marqué comme obsolète.
La cartographie suggérée par Clighter est
Notez que le plug-in successeur clighter8 a supprimé la fonctionnalité de changement de nom dans le commit 24927db42 .
Si vous utilisez neovim, vous pouvez jeter un œil à la pince du plugin . Ça suggère
la source
J'ai écrit ce plugin pour le refactoring générique. Il nécessite encore de nombreuses améliorations. Dans le futur, j'essaierai d'abandonner les ctags au profit de clang pour les refactorisations C & C ++.
la source
Peut-être pas la solution la plus élégante, mais je l'ai trouvée très pratique: j'utilise ECLIM pour connecter VIM et Eclipse. Bien sûr, toute mon édition de code source est effectuée en VIM, mais quand il est temps de refactoriser, on peut profiter des capacités supérieures d'Eclipse dans ce domaine.
Essaie.
la source
Plugin Factorus
Il existe un autre plugin vim dédié au refactoring appelé factorus qui est disponible sur github .
Actuellement (2017-12), il prend en charge les langues
la source
Plugin YouCompleteMe ( YCM ) (20k étoiles sur github)
http://ycm-core.github.io/YouCompleteMe/#the-refactorrename-new-name-subcommand
Par défaut, il n'y a pas de mappage.
la source
Placez le curseur sur le nom pour refactoriser et taper
gd(ou gDsi vous refactorisez une variable globale).
ensuite
cgn nouveau nom esc
et
. une ou plusieurs fois pour refactoriser l'occurrence (s) suivante (s)
ou
:%norm . pour refactoriser toutes les occurrences dans le tampon à la fois.
la source
J'écris beaucoup de code C / C ++ dans vim. Le refactoring le plus courant que je fais est de renommer les variables, les noms de classe, etc. Habituellement, j'utilise
:bufdo :%s/source/dest/g
pour faire une recherche / remplacement dans des fichiers, ce qui est presque le même que le changement de nom fourni par les grands IDE.Cependant, dans mon cas, j'ai trouvé que je renomme généralement des entités similaires, épelées dans des cas différents (par exemple, CamelCase, snake_case, etc.), j'ai donc décidé d'écrire un petit utilitaire pour aider à ce genre de recherche "smart-case" / replace, il est hébergé ici . C'est un utilitaire de ligne de commande, pas un plugin pour vim, j'espère que vous pourrez le trouver utile.
la source
Pour la refactorisation, si vous utilisez Unite (et vous devriez), vous pouvez alors utiliser vim-qfreplace et le rendre extrêmement facile. Regardez cette vidéo qui montre comment cela fonctionne. Une fois votre flux de travail défini, vous pouvez faire des mappages pour l'optimiser (au lieu de saisir la plupart des choses comme dans la vidéo).
la source
Une combinaison de deux plugins: vim-ripgrep , pour rechercher dans les fichiers et placer les résultats dans la fenêtre quickfix, et quickfix-reflector pour enregistrer les modifications directement dans la fenêtre quickfix et enregistrer automatiquement chaque modification dans les fichiers.
la source
J'envisagerais d'utiliser la version spacemacs d'emacs. Il utilise les mêmes modes et la plupart des frappes de touches que Vim mais a beaucoup plus de modules complémentaires en raison de sa nature lisp. Si vous voulez programmer en C ++, vous ajoutez simplement la couche C ++ et la plupart de l'EDI est déjà configuré pour vous. Pour d'autres langages interprétés comme python ou bash, vous n'avez pas besoin de quitter spacemacs pour les utiliser. Ils ont même un moyen d'exécuter des blocs de code directement dans votre texte, ce qui fonctionne parfaitement pour la programmation littéraire ou la programmation reproductible où le code et les données sont dans le même fichier. Les deux sont faits sous forme de texte.
Spacemacs est beaucoup plus lourd dans sa charge initiale, mais les choses supplémentaires que vous pouvez en faire valent les quelques secondes de coût de démarrage. Un mode d'organisation d'une couche vaut la peine d'être vérifié. C'est le meilleur outliner, programmeur, minuterie de jour / liste de tâches que j'ai jamais utilisé.
la source
Aller
Il existe un plugin vim https://github.com/godoctor/godoctor.vim qui les rend disponibles
vim-go
:GoRename
.Serveur de langue
gopls
la source