web-dev-qa-db-fra.com

Refactoring à Vim

Bien sûr, le fait que vous puissiez refactoriser les IDE est inestimable pour beaucoup, je le fais rarement lorsque je suis en train de coder, mais je peux essayer de le faire lors de l'édition de la source de quelqu'un d'autre. Comment effectuez-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?

76
Helmut Granda

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

Le refactoring qui a plus à voir avec les remplacements réguliers J'utilise habituellement : grep sur mon arbre de projet, puis enregistrer une macro pour faire le refactor -: g et: s ne sont pas un brainers. Cela me permet généralement de modifier rapidement un grand nombre de fichiers avec un minimum d'effort. Honnêtement, j'utilise cette méthode plus que toute autre.

Selon votre flux de travail, les commandes intégrées peuvent être lentes/gênantes. Si vous utilisez git, vous allez utiliser l'excellent plug-in Fugitive et sa commande :Ggrep pour ne rechercher que 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 nécessitant des modifications via :vimgrep, je recourt aux commandes grep/find de la ligne de commande pour examiner de plus près la liste des fichiers à refactoriser. Enregistrez la liste dans un fichier texte et utilisez :e et un mashup d’enregistrements de macros pour apporter les modifications nécessaires.

Je trouve que moins je rouille dans mes compétences en enregistrement macro, plus je trouve Vim utile pour le refactoring: se sentir à l’aise d’enregistrer/restaurer des registres, d’incrémenter/décrémenter des variables de compteur de registres, de nettoyer/sauvegarder des enregistrements de macro dans un fichier pour une utilisation ultérieure, etc.


Mettre à jour

Depuis que j'ai écrit ces vidéocasts, les méthodes que je décris ont été publiées sur vimcasts.org (je vous encourage à regarder TOUS les Vimcasts! ). Pour le refactoring, regardez ceux-ci:

Vimgolf est également un excellent moyen de pratiquer.

63
dsummersl

Famille C

  1. Essayez le plugin Clighter pour renommer le refactoring pour la famille c. Il est basé sur clang, mais il existe des limitations et le plugin est marqué comme obsolète.

    Le mappage suggéré par Clighter est

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

    Notez que le plugin successeur clighter8 a supprimé la fonctionnalité de changement de nom du commit 24927db42 .

  2. Si vous utilisez neovim, vous pouvez jeter un oeil au plugin clamp . Ça suggère

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

Python

Pour le langage python, les plugins suivants fournissent des fonctionnalités de "renommée" pour vim:

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

J'ai écrit ce plugin pour le refactoring générique. Cela nécessite encore de nombreuses améliorations. Un jour, dans le futur, j'essaierai d'abandonner les balises en faveur de clang pour les refactorings C & C++.

5
Luc Hermitte

Ce n’est peut-être pas la solution la plus élégante, mais j’ai trouvé cela très pratique: j’utilise ECLIM pour connecter VIM et Eclipse. Bien sûr, tout mon édition de code source est réalisée dans VIM, mais quand vient le temps de refactoriser, on peut tirer parti des capacités supérieures d'Eclipse en la matière.

Essaie.

4
fjrg76

Protocole de serveur de langue (LSP)

Un serveur de langue dédié permet également de renommer. Par exemple.

Un client vim editor est nécessaire. Les options suivantes existent actuellement:

  1. https://github.com/autozimu/LanguageClient-neovim qui suggère de procéder au mappage suivant pour renommer:

    nnoremap <silent> <F2> :call LanguageClient_textDocument_rename()<CR>
    
  2. https://github.com/prabirshrestha/vim-lsp qui fournit la commande suivante

    :LspRename
    
  3. https://github.com/natebosch/vim-lsc Je ne pouvais pas trouver de support pour le changement de nom, mais je m'attendais à ce que cela soit ajouté.

3
Hotschke

Plugin Factorus

Il existe un autre plugin vim dédié à la refactorisation appelé factorus qui est disponible sur github .

Actuellement (2017-12), il prend en charge les langues.

  • c
  • Java et
  • python.
3
Hotschke

Plugin YouCompleteMe (YCM) (15k étoiles sur github)

:h RefactorRename-new-name

La sous-commande RefactorRename <new name>

Dans les types de fichiers pris en charge, cette commande tente d'effectuer un changement de nom sémantique de l'identifiant sous le curseur. Cela inclut le changement de nom des déclarations, définitions et utilisations de l'identifiant, ou de toute autre langue appropriée action. Le comportement spécifique est défini par le moteur sémantique utilisé.

Semblable à | FixIt |, cette commande applique des modifications automatiques à votre fichiers source. Les opérations de changement de nom peuvent impliquer des modifications sur plusieurs fichiers, ce qui peut ou peut ne pas être ouvert dans les tampons Vim à ce moment. YouCompleteMe gère tout de cela pour vous. Le comportement est décrit dans la section suivante.

Pris en charge dans les types de fichiers: 'javascript' (variables uniquement), 'TypeScript'

Par défaut, il n'y a pas de mappage. Mais bien sûr, vous pouvez en définir un si vous le souhaitez.

2
Hotschke

J'écris beaucoup de code C/C++ dans vim. Le refactoring le plus courant que je fais est de renommer des variables, des noms de classes, etc. Habituellement, j'utilise :bufdo :%s/source/dest/g pour effectuer une recherche/remplacement dans des fichiers, ce qui est presque identique à un changement de nom fourni par un grand IDE.
Cependant, dans mon cas, j’ai constaté que je renommais généralement des entités similaires, orthographiées dans différents cas (CamelCase, snake_case, etc.), j’ai donc décidé de créer un petit utilitaire pour aider ce type de "casse-tête "rechercher/remplacer, il est hébergé ici . C'est un utilitaire en ligne de commande, pas un plugin pour vim, j'espère que vous pourrez le trouver utile.

1
dkrikun

Pour la refactorisation, si vous utilisez Unite (et vous devriez), vous pouvez ensuite utiliser vim-qfreplace et le rendre extrêmement facile. Cochez cette vidéo qui montre comment cela fonctionne. Une fois que votre flux de travail est défini, vous pouvez effectuer des mappages pour l'optimiser (au lieu de taper la plupart des choses comme dans la vidéo).

0
BenC

Une combinaison de deux plugins: vim-ripgrep , pour rechercher des fichiers à travers et placer les résultats dans la fenêtre du correctif, et quickfix-reflector pour enregistrer les modifications dans le fenêtre de correction rapide et qu’il enregistre automatiquement chaque modification dans les fichiers.

0
Jason

J'envisagerais d'utiliser la version spacemacs d'emacs. Il utilise les mêmes modes et la plupart des frappes au clavier que Vim, mais comporte de nombreux ajouts en raison de sa nature, LISP. Si vous voulez programmer en C++, ajoutez simplement la couche c ++ et la plupart du IDE 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 est fantastique pour une programmation alphabète ou reproductible dans laquelle le code et les données se trouvent dans le même fichier. Les deux sont faits en texte.

Spacemacs est beaucoup plus lourd que sa charge initiale, mais le travail supplémentaire que vous pouvez faire avec cela vaut les quelques secondes de coût de démarrage. Une couche en org-mode vaut le détour. C’est le meilleur outliner, programmeur, minuteur/liste de tâches que j’ai jamais utilisé. 

0
C. Kelly Osborn