(de-)Commenter de gros blocs de code

ClicCoolClicCool Membre
Bonjour,

Pour commenter/dé-commenter quelques lignes de code y'a le racourci-clavier Pomme /

Pour de gros blocs il est souvent plus aisé de l'encadrer simplement par la balise "/*" au début et la balise "*/" à  la fin du bloc.

Mais quand il s'agit, pour un même bloc de le commenter, puis le dé-commenter à  plusieurs reprises c'est vite désagréable.
A peine avons nous tapé le /* que toute la fin de notre page est verte, ce qui rend le repérage visuel de la fin du bloc difficile pour aller y taper le */

On peut alors toujours commencer par repérer la fin du bloc et y placer le */ puis remonter au début pour taper le /* magique.

Mais parfois, à  force de commenter/dé-commenter on finit par fatiguer et se prendre des "syntax error befor / token" sur le */ oublié.

Mon truc et d'utiliser comme balise de fin de bloc: "//*"
Comme ça, même si on l'oublie, pas d'erreur de compil, c'est un commentaire comme un autre.
Et en début de bloc on peut alors placer/Enlever/remettre/Commenter un /*

Mieux encore, le racourci-clavier Pomme / appliqué sur le /* deviens alors efficace sur tout le Bloc de code (à  l'envers).
  /* le bloc de code suivant est commenté
// /* le bloc de code suivant n'est pas commenté
Et on peut tranquillement laisser nos balises autour du bloc en question pour y revenir plus tard ;)

Réponses

  • psychoh13psychoh13 Mothership Developer Membre
    05:13 modifié #2
    Cette technique pour commenter le code qu'on veut éviter de compiler temporairement n'est pas super, s'il y a des commentaires imbriqués ça boguera...

    Une bonne technique est de mettre le code entre les balises de préprocesseurs #if 0 #endif
    Cette technique a plusieurs avantages...
    Quand on a besoin de "décommenter" la partie de code "commentée" il suffit de remplacer 0 par 1 au lieu de supprimer les balises.
    Il est aussi possible d'alterner facilement deux parties de code qui ont le même but mais qui fonctionnent différemment afin de tester la technique qui marche le mieux :

    // mon code<br /><br />#if 0 // mettre 1 pour prendre la première partie du code.<br /><br />// mon code commenté<br /><br />#else<br /><br />// code alternatif<br /><br />#endif
    
  • ClicCoolClicCool Membre
    05:13 modifié #3
    dans 1201280525:

    Cette technique pour commenter le code qu'on veut éviter de compiler temporairement n'est pas super, s'il y a des commentaires imbriqués ça boguera...


    Merci de tes précisons, tu as raison et nuls doutes que je sous-utilise les instructions de pré-processeur.
    (faudrait sans doutes que je sollicite humblement des cours particuliers à  Maà®tre Renaud là  dessus)

    Par contre, si celles-ci sont utiles pour de longs tests sur plusieurs jours, elles ont l'inconvénient majeur de ne pas clairement signaler le code qui ne sera pas exécuté.
    Et je t'avoue que, sur une petite série de test genre "avec versus sans"), je préfère que le code exclus soit clairement commenté, en vert (et contre tous ?).
  • AliGatorAliGator Membre, Modérateur
    05:13 modifié #4
    Bonjour ClicCool ;) Ravi de te revoir parmi nous  :adios!:

    Ca me fait penser à  un truc : dans VisualStudio (oui, je sais, c'est M$ >:) Mais j'ai pas le choix de devoir bosser là  dessus au taf :crackboom:- ) il y a des extensions comme "VisualAssist" qui permettent de modifier/améliorer la coloration syntaxique. En particulier tous les blocs #if ... #endif qui ne seront pas compilés (parce que le test en face du "#if" est évalué à  FALSE) sont en gris pâle pour bien nous montrer que le code est désactivé..


    Tout ça pour dire : n'y aurait-il pas un moyen de développer ce genre de choses (plugins ? Modifs des prefs quitte à  passer par des "defaults" ou creuser plus loin si ce n'est pas dispo par la GUI de XCode ?) pour l'éditeur de code intégré à  XCode, qu'il mettre d'une toute autre couleur le code entre un "#if 0 ... #endif" par exemple ?

    Sinon je ne sais pas si l'utilisation d'un éditeur externe (certains utilisent TextMate par exemple, comme Renaud justement il me semble) résoud le problème, car la problématique est quand même plus compliquée qu'une simple coloration syntaxique : Ce n'est pas juste une affaire de RegEx pour voir qu'on est entre "/*" et "*/" par exemple, mais il faut aussi que le moteur de coloration évalue la valeur du test derrière le "#if" ou "#ifdef", c'est ça c'est pas toujours évident... surtout si on fait intervenir des macros #defined ou définies dans les réglages du projet Xcode...
  • ClicCoolClicCool Membre
    05:13 modifié #5
    dans 1201293734:

    Bonjour ClicCool ;) Ravi de te revoir parmi nous  :adios!:


    Merci Ali, pourfendeur des grincheux  :)
    Je suis ravi d'être là  aussi !   <3 <br />
    Le plus fou c'est que au fur et à  mesure de ces années bisextiles qui m'offrent leurs 24 heures de plus que j'exploite pour me re-mettre à  coder c'est chaque fois un réel plaisir et un bouillonnement d'idées à  mettre en pratique arrive immédiatemet :)

    Alors, si on y ajoute la joie de cotoyer tous ces cocoaculteurs c'est le top !  <3 <br />


    J'ajouterais que entre le C (plaisir de rigueur et de pureté) , le C++ (joies de l'encapsulation propre surtout aidé par les supers frameWorks de CodeWarrior) et l'Objective-C avec Cocoa y'a pas photo.
    Se remettre au Cocoa, c'est comme de remonter sur un vélo quand on a déjà  apris à  en faire, ça vient tout seul  :brule:

    En plus le Projet qui me ramène à  mes "amours aux développement généreux" :P est un gros projet et j'aurais sans doutes la joie de m'y plonger quelques mois sans trop culpabiliser ;)

    @+

  • janvier 2008 modifié #6
    dans 1201293734:
    Sinon je ne sais pas si l'utilisation d'un éditeur externe (certains utilisent TextMate par exemple, comme Renaud justement il me semble)


    Renaud il utilise TextMate et Xcode, TextMate seul ce n'est pas évident, à  cause du manque d'intégration avec le reste.

    Sinon pour la question des commentaires, bon évidemment TextMate a une macro pour faire ce que tu souhaites, mais ce n'est pas la question.

    La question c'est de savoir si Xcode peut le faire et la réponse est oui.

    Menu Script -> Edit User Scripts, puis cliquer sur le + et coller le code suivant:

    [tt]#!/usr/bin/env ruby -wKU

    input = STDIN.read.to_s
    regex = /(.*)\/\*(.*)\*\/(.*)/m

    if input =~ regex
      print input.gsub(regex,'\1\2\3')
    else
      print "/*#{input}*/"
    end[/tt]

    (Juste bien veiller à  bien spécifier que l'output remplace la sélection)

    Si tu appelles ce script pour une sélection de code qui contient un commentaire en /* */, il supprimera les /* */ sans toucher au reste (donc inutile de sélectionner précisément). Et si la sélection ne contient pas de commentaire, la sélection est commentée. Petite note: il n'y a pas de contrôle pour vérifier que la sélection de contienne qu'une seule des 2 balises.

    Pour Ali: TextMate peut certainement faire ce dont tu parles, il fait un truc dans le genre en HTML/CSS: le bundle css est utilisé pour la colorisation pour le texte entre des balises <style></style>. Le tout est de savoir comment.
  • ClicCoolClicCool Membre
    05:13 modifié #7
    Merci Renaud !

    ça marche impec ton truc  :kicking:

    Je l'ai ajouté à  mes scripts.

    Ceci dit on en revient +/- au même soucis que le "Pomme /" traditionnel (sauf évidemment la syntaxe du commentaire)
    C'est à  dire qu'il faut sélectionner le bloc entier avant d'activer le script, ce qui est facile et clair quand toutes les lignes sont visible sur une seule page (mais à  ce moment là  les // font l'affaire).
    Mais si le bloc est un peu trop gros ....

    L'avantage que je trouvais aux "/*" + "//*/" c'était, entre autre, de laisser une balise de fin en place en faisant varier de position la balise de début.

    En tous les cas je me coucherai moins bête encore ce soir (pourvu que ça dure) en ayant entrevu grâce à  toi l'éditeur de ce menu script  :p
  • ClicCoolClicCool Membre
    05:13 modifié #8
    Et bien voilà  ! Fallait que ça arrive !

    je viens de vivre les limitations de mes neurones face à  un code n'apparaissant comme clairement exclus.
    J'ai passé un long moment ce matin devant mon code "qui ne marchait plus qu'à  moitié", jusqu'à  ce que me rende compte qu'hier soir j'avais laisser un "#if 0 ..." trainer !!!
    Des pages de code modifiées et re-modifiées pour corriger "l'erreur" et 1 heure pour tout remettre en ordre (j'avais pas fait de snapshot avant :( )


    Ceci-dit la "méthode Psychoh" est pas mal du tout pour permuter entre 2 blocs à  évaluer/comparer ! Merci
    Faut juste avoir passé une bonne nuit et brendre un bon café avant de retourner à  son code  ;)
  • psychoh13psychoh13 Mothership Developer Membre
    05:13 modifié #9
    Ah là  tu t'es fais avoir mon pauvre... Désolé :D

    Si tu veux éviter ce genre de problème, il y a une autre technique : à  chaque fois que tu mets un #if, tu rajoutes juste avant (parce qu'après tu ne le vois pas :D) un #warning... :

    #warning Attention il y a un #if 0 ici...<br />#if 0<br /><br />// ton code commenté<br /><br />#endif
    


    Et comme ça le compilateur te le fait apparaà®tre à  la compilation si tu l'as oublié. :D
  • 05:13 modifié #10
    dans 1201426890:
    Mais si le bloc est un peu trop gros ....

    L'avantage que je trouvais aux "/*" + "//*/" c'était, entre autre, de laisser une balise de fin en place en faisant varier de position la balise de début.


    L'autre avantage d'avoir les 2 scripts à  portée de main, c'est d'avoir la possibilité de laisser des commentaires en "//" dans le code à  ignorer. Sinon le /* */ a aussi un autre avantage: il marche aussi dans une même ligne.

    Sinon pour les gros blocs de code, il y a un truc pas mal dans Xcode. Les raccourcis clavier "Set Mark" (ctrl-espace par défaut) "Select to Mark (Ctrl-X-Ctrl-M par défaut - le raccourci c'est la double combinaison).

    Donc le principe est simple: tu mets le point d'insertion au début du bloc que tu veux commenter, puis "Set Mark". Puis tu te déplaces tranquillement jusqu'à  la fin du dit bloc et là  tu appelles "Select To Mark", et hop magie tout est sélectionné.

    Et dans la série des "To Mark", il y en a d'autres qui sont intéressants:
    "Delete To Mark": explicite
    "Swap With Mark": pratique si on édite deux morceaux dans un même fichier pour passer de l'un à  l'autre. On pose une marque dans le premier, on va ensuite travailler dans l'autre, puis pour revenir au premier "Swap With Mark", puis pour revenir au second "Swap With Mark" encore.

    Mais il faut changer les raccourcis claviers!
  • psychoh13psychoh13 Mothership Developer Membre
    05:13 modifié #11
    Ce qui est dommage avec les marques c'est que ça n'affiche rien pour indiquer que tu as fait une marque.
  • ClicCoolClicCool Membre
    05:13 modifié #12
    dans 1201438297:
    .../...L'autre avantage d'avoir les 2 scripts à  portée de main, c'est d'avoir la possibilité de laisser des commentaires en "//" dans le code à  ignorer. Sinon le /* */ a aussi un autre avantage: il marche aussi dans une même ligne.

    Oui en effet

    dans 1201438297:
    Sinon pour les gros blocs de code, il y a un truc pas mal dans Xcode. Les raccourcis clavier "Set Mark" (ctrl-espace par défaut) "Select to Mark (Ctrl-X-Ctrl-M par défaut - le raccourci c'est la double combinaison).../...

    Encore une découverte pour moi, merci :)
    en plus si plusieurs lignes sont sélectionnées lors d'un swap-mark, au swap-mark suivant elle seront encore sélectionnees.
  • ClicCoolClicCool Membre
    05:13 modifié #13
    dans 1201438297:
    Sinon pour les gros blocs de code, il y a un truc pas mal dans Xcode. Les raccourcis clavier "Set Mark" (ctrl-espace par défaut) "Select to Mark (Ctrl-X-Ctrl-M par défaut - le raccourci c'est la double combinaison).

    Donc le principe est simple: tu mets le point d'insertion au début du bloc que tu veux commenter, puis "Set Mark". Puis tu te déplaces tranquillement jusqu'à  la fin du dit bloc et là  tu appelles "Select To Mark", et hop magie tout est sélectionné.

    Et dans la série des "To Mark", il y en a d'autres qui sont intéressants:
    "Delete To Mark": explicite
    "Swap With Mark": pratique si on édite deux morceaux dans un même fichier pour passer de l'un à  l'autre. On pose une marque dans le premier, on va ensuite travailler dans l'autre, puis pour revenir au premier "Swap With Mark", puis pour revenir au second "Swap With Mark" encore.

    Mais il faut changer les raccourcis claviers!


    dans 1201441678:

    Ce qui est dommage avec les marques c'est que ça n'affiche rien pour indiquer que tu as fait une marque.



    J'ai rouvé une autre solution qui complète uilement la panoplie et résout le problème des mark 'inapparentes'.  :brule:

    On peut s'approcprier les balises que xCode utilise pour marquer les placeHolder lors d'une autocomplétion :)
    Une ligne commentée contenant un  "<#" suivi de-ce-qu'on-veut puis terminé par "#>"
    C'est TRES TRES pratique aussi pour marquer les zone du code méritant qu'un y revienne plus tard.
    dans le genre
    - (void) windowWillClose:(NSNotification*) aNotification {<br />	// &lt;#ICI: permettre aussi de terminer plus propremrnt l&#39;édition de Trt déjà  en cours#&gt;<br />	if ( ( panelTraitement == [aNotification object] )	// Si c&#39;est le panel d&#39;edition de tr que l&#39;on ferme<br />		|| (self.traitementEdite) ) {					// et, de TOUTES FACONS, si un trt etait en edition<br />		[self cancelEditeTrt:self];						// -&gt; ANNULER L&#39;edition du trt<br />        // .../... <br />	}<br />
    


    Avantages:
    - On peut mettre autant de ces marques explicites que souhaitées
    - On navigue rapidement entre les marques avec le raccourci que l'on a choisi dans Text key Bindings des prefs pour "Code Sense select Next Placeholder" et "Code Sense select Previous Placeholder"
    - le texte écrit entre les deux balises retrouvées saute aux yeux en apparaisant selectionné et son effacement (y comprs les balises se fait alors d'un seul coup de "backsapce"

    Inconvénient:
    - évidemment, ces même raccourcis servent aussi pour naviguer entre les "vrai" placeHolder lors d'une complétion. Mais ça gène pas vraiment car dans ce dernier cas les placeHolder sont regroupés sous nos yeux sur maximum 3 lignes et il y a peu de chance qu'on se loupe.

    ET, lorsqu'on a l'impression d'avoir fini de coder la classe un rapide coup de "next placeHolder" nous permet de pas louper le dernier bout de code qu'on a encore oublié d'améliorer.


    Présision: à  noter qu'avec xCode 3.1 les "vrais" placeHolders apparaissent maintenant plus proprement surlignés en bleu et sans balises visibles , mais elles y sont toujours et restent fonctionnelles :)
  • AliGatorAliGator Membre, Modérateur
    05:13 modifié #14
    Ah ouais pas con du tout ça c'est de l'astuce bien trouvée :)

    Merci ClicCool... et  :p bijour au passage (ça fait un bail, dis, que j'ai pas pris de tes news, tiens ;) quoi de neuf à  part ce qu'on voit sur les forums, comme ta frustration sur le SDK iPhone ? :))
  • ClicCoolClicCool Membre
    05:13 modifié #15
    dans 1205436635:

    Merci ClicCool... et  :p bijour au passage (ça fait un bail, dis ;))


    :) Qu'est-ce que je te sers ? c'est ma tournée  :p :p
  • AliGatorAliGator Membre, Modérateur
    05:13 modifié #16
    dans 1205436749:

    :) Qu'est-ce que je te sers ? c'est ma tournée  :p :p
    Une petite Cantillon ? (J'allais dire une Fou'foune mais ça portais à  confusion :) alors optons pour la Gueuze :P)
  • ClicCoolClicCool Membre
    05:13 modifié #17
    dans 1205437073:
    Une petite Cantillon ? (J'allais dire une Fou'foune mais ça portais à  confusion :) alors optons pour la Gueuze :P)


    Attends, je vais voir ça ...
    Navré, j'en ai plus :(
    [Mode Mauvaise foi] Faut dire que mon fournisseur attitré ne trouve jamais le temps de venir me voir [\Mode Mauvaise foi]

    Mais j'ai une cuvée spéciale de HB si tu veux : ;)


  • AliGatorAliGator Membre, Modérateur
    05:13 modifié #18
    Quoi, plus de Cantillon, mais c'est un scandale ! (Bon ok moi aussi mes réserves sont épuisées, je me contente de la Lindemans :P)

    Mais le HB ça me va très bien, de toute façon je me doutais que t'aurais plus de Cantillon et je comptais bien te demander du jaune, là  je suis gâté  :)
Connectez-vous ou Inscrivez-vous pour répondre.