web-dev-qa-db-fra.com

Comment puis-je refactoriser le code source C++ en utilisant emacs?

Je suis surtout intéressé par les changements automatiques de C++ et de méthode/nom de classe/signature.

43
Łukasz Lew

Je le fais souvent et j’attends donc d’autres réponses.

Les seules astuces que je connaisse sont vraiment basiques. Voici mes meilleurs amis dans Emacs lors du refactoring de code:

M-x query-replace

Cela vous permet d'effectuer une recherche globale et de la remplacer. Cela se fera énormément lorsque vous déplacerez des méthodes et des données fréquemment utilisées vers d'autres classes ou espaces de noms.

C-x 3

Cela vous donne un affichage avec deux tampons côte à côte. Vous pouvez ensuite charger différents fichiers et déplacer votre curseur de l'un à l'autre avec C-x o. C'est assez basique, mais je le mentionne à cause de la puissance du prochain ...

C-x (
(type any amount of stuff and/or emacs commands here)
C-x )

Voici comment vous définissez une macro dans emacs. Chaque fois que vous vous retrouvez dans l'obligation de répéter la même chose à un tas de code (et que c'est trop complexe pour une requête de remplacement), c'est une bouée de sauvetage. Si vous vous trompez, vous pouvez appuyer sur C-g pour arrêter la définition de la macro, puis annuler (C-_) jusqu'à ce que vous soyez revenu à votre point de départ. Les clés pour appeler la macro sont C-x e. Si vous voulez le faire plusieurs fois, vous pouvez appuyer sur Esc et taper un nombre en premier. Exemple: Esc 100 C-x e tentera d’appeler votre macro 100 fois.

(Remarque: Sous Windows, vous pouvez obtenir «Meta» en appuyant sur la touche Échap ou en maintenant Alt).

14
T.E.D.

В последних версиях Emacs (24) Semantic способен на это.

  1. Возможно активировать семантический режимM-x semantic-mode RET,.
  2. Откройте буфер Symref с помощьюC-c , g,.
  3. НажмитеC-c C-eоткрыть все ссылки.
  4. Переименовать сR,.
29
muede

Si vous pouvez programmer dans elisp, vous pouvez rechercher une combinaison de cedet + srecode à partir de bibliothèques CEDET - elle fournit tous les instruments pour cette tâche - recherche des appelants de fonctions, signature, etc. Mais vous devez créer vous-même un outil réfractaire , en utilisant ces instruments 

25
Alex Ott

Car quelque part entre les outils de refactoring et les expressions rationnelles simples, depuis Emacs 22, vous pouvez incorporer des expressions elisp arbitraires dans votre texte de remplacement, ce qui vous permet d’effectuer une manipulation de texte incroyablement puissante. Steve Yegge a écrit un bon article à ce sujet il y a quelque temps.

8
jamesnvc

Avec le ccls ou cquery , qui fournit le "protocole de serveur de langue" (lsp), vous pouvez refactoriser les noms avec:

M-x lsp-rename

Alternative: srefactor utilise le framework de mode sémantique emacs: https://github.com/tuhdo/semantic-refactor/blob/master/srefactor-demos/demos.org

Vous pouvez l'obtenir avec M-x package-install auprès de MELPA ou sur https://github.com/tuhdo/semantic-refactor/ .

7
TheJJ

Un de mes amis jouait avec xrefactory et m'a dit que cela fonctionnait plutôt bien. Ce n'est pas bon marché cependant.

6
Greg Rogers

Construire des symboles cscope.

cherchez le symbole que vous voulez refactoriser.

entrez dans la fenêtre cscope et lancez une macro après avoir placé le curseur à la première occurrence

  • ret
  • c-f votre symbole commence
  • naviguer pour commencer votre symbole
  • modifier le mot
  • c-x o (retour à cscope)
  • n (for next cscope symbol)

vous devez juste c-x c-e maintenant

4
Vijayender

Je suis tout à fait d'accord pour dire que trouver et remplacer du travail est parfait. Cependant, cedet a une fonctionnalité vraiment sympa: "semantic-symref-list". 

Avec le curseur sur une méthode, exécutez cette commande. Un tampon répertoriant tous les emplacements de votre code faisant référence à cette balise vous sera présenté.

Vous pouvez toujours utiliser des astuces de recherche et remplacement, ce qui confirmera que vous avez modifié toutes les références.

2
user7957

J'utilise cquery pour ma complétion C++, qui utilise Microsoft LSP pour la communication IDE <-> Tool. Le serveur cquery satisfait les demandes du protocole LSP à l'aide d'un backend clang.

lsp-emacs est le paquetage situé entre emacs et le backend cquery (cquery-emacs) qui expose une fonction lsp-rename. En tant que système d’achèvement, cquery a été très fiable et rapide, il est vivement recommandé.

Essayez, suivez le guide de démarrage du cquery github: https://github.com/cquery-project/cquery/wiki/Emacs

Une fois que vous avez installé cquery:

  1. Passez votre curseur sur un identifiant (classe, var, ou quoi que ce soit) que vous souhaitez renommer.
  2. M-x lsp-rename
  3. Entrez le new nom pour l'identifiant.
  4. Do C-x s (save some buffers), ce qui vous invitera à sauvegarder Tous les tampons touchés par le refactor.

Vous devriez probablement parcourir tous les tampons modifiés et vérifier ce qui a été fait après le refactoring avec n'importe quel outil/langage.

0
nenchev