IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

Trier les fonctions vscode par ordre alphabétique


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de cavo789
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2004
    Messages
    1 797
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 797
    Par défaut Trier les fonctions vscode par ordre alphabétique
    Bonjour à tous

    Petite bouteille à la mer... Quelqu'un connaît-il une astuce pour que, lorsque je programme mes scripts Bash, les fonctions définies dans mon code soient triées par ordre alphabétique; par exemple lorsque je sauve le script.

    Il semble que shfmt ne le fasse pas contrairement à d'autres outils similaires dans le monde PHP p.ex.

    Concrètement; si je sauve mon code ci-dessous, j'aimerais que la fonction array::implode soit déplacée au début du fichier (ordre alphabétique).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    function array::sort() {
    }
     
    function array::sortAssoc() {
    }
     
    function array::implode() {
    }
    Merci !

  2. #2
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 297
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 297
    Par défaut
    Bonjour

    Pas d'idée. Mais si ton fichier est aussi propre que celui que tu montres, tu peux tenter des manipulations à la main.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    $ cat fichier.txt 
    #!/usr/binbash
     
    function array::sort() {
     { echo blablabla
     }
    }
     
    function array::sortAssoc() {
    }
     
    function array::implode() {
    }
     
    # code à exécuter
     
    # en plusieurs lignes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    $ awk 'BEGIN{m="debut";} /^function/{m=$0;} {p[m]=p[m]$0"\n";} /^}/{m="fin";} END{n=asorti(p,t); printf p["debut"]; for (i=1;i<=n;i++) if ((t[i]!="debut")&&(t[i]!="fin")) print p[t[i]]; printf p["fin"];}' fichier.txt
    #!/usr/binbash
     
    function array::implode() {
    }
     
    function array::sort() {
     { echo blablabla
     }
    }
     
    function array::sortAssoc() {
    }
     
     
     
     
    # code à exécuter
     
    # en plusieurs lignes

  3. #3
    Membre Expert
    Avatar de cavo789
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2004
    Messages
    1 797
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 797
    Par défaut
    Bonjour Flodelarab

    Impressionnant !!!

    C'est presque ça ... toutefois pour la simplicité de mon exemple, je n'avais fait que reprendre mes fonctions; sans aucun bloc de commentaires.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    #!/usr/bin/env bash
     
    # region - Intro block -----------------------------------------------
    # ......
    # endregion - Intro block --------------------------------------------
     
    # let script exit if an unsed variable is used or if a command fails
    set -o nounset
    set -o errexit
     
    # region - public function array::sort
    # ......
    # endregion
    function array::sort() {
        # ......
    }
     
    # region - public function array::sortAssoc
    # ......
    # endregion
    function array::sortAssoc() {
        # ......
    }
     
    # region - public function array::implode
    # ......
    # endregion
    function array::implode() {
        # ......
    }
    Lorsque je lance la commande awk que tu proposes (merci!); j'obtiens

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    #!/usr/bin/env bash
     
    # region - Intro block -----------------------------------------------
    # ......
    # endregion - Intro block --------------------------------------------
     
     
    # let script exit if an unsed variable is used or if a command fails
    set -o nounset
    set -o errexit
     
     
    # region - public function array::sort
    # ......
    # endregion
    function array::implode() {
        # ......
    }
     
     
    function array::sort() {
        # ......
    }
     
     
    function array::sortAssoc() {
        # ......
    }
     
     
     
     
    # region - public function array::sortAssoc
    # ......
    # endregion
     
     
    # region - public function array::implode
    # ......
    # endregion
    Il s'est un peu emmêlé les pinceaux avec les commentaires...

    Les blocs de commentaire sont donc des "régions" où j'écris une explication, au format Markdown, de ma fonction.

    Pour la fonction array::implode p.ex. voici le docblock

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    # region - public function array::implode#
    # ## Description
    #
    # Convert an array to a string
    #
    # See also string::explode() which make the inverse
    #
    # ## Examples
    #
    # ```
    # array::implode ("one" "two" "three")  # will return "one;two;three"
    # ```
    #
    # ## Parameters
    #
    # @arg array An array
    # @arg string Optional, the delimiter. The default is ";"
    #
    # ## Return
    #
    # Return a string; each item in the array will be concatenated to a string; separated by a delimiter
    #
    # ## Exit code
    #
    # 0 If successful.
    # 1 An error has occured.
    # 2 Function missing arguments.
    #
    # endregion
    (j'ai une trentaine de fichiers .sh qui correspondent en fait à des helpers Bash que je développe / maintiens pour mes projets; le docblock me sert à pouvoir automatiser ma documentation (avec un script d'extraction puis de création d'un fichier markdown par fichier .sh trouvé)

    L'idée est donc dans l'automatisation du tri des noms de fonctions pour avoir un truc plus propre ;-)

    [EDIT]S'il y a le moindre doute sur l'exactitude de la commande à écrire (awk), ne perds pas ton temps; c'est trop risqué de lancer un code de reformatage d'un source si le code n'est pas bullet-proof[/EDIT]

  4. #4
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 297
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 297
    Par défaut
    Le tout est de savoir ce qui commence un nouveau bloc. Je change juste le motif "^function" en "^# region".
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    $ awk 'BEGIN{m="debut";} /^# region/{m=$0;} {p[m]=p[m]$0"\n";} /^}/{m="fin";} END{n=asorti(p,t); printf p["debut"]; for (i=1;i<=n;i++) if ((t[i]!="debut")&&(t[i]!="fin")) print p[t[i]]; printf p["fin"];}' fichier.txt 
    #!/usr/bin/env bash
     
    # region - Intro block -----------------------------------------------
    # ......
    # endregion - Intro block --------------------------------------------
     
    # let script exit if an unsed variable is used or if a command fails
    set -o nounset
    set -o errexit
     
     
    # region - public function array::implode
    # ......
    # endregion
    function array::implode() {
        # ......
    }
     
    # region - public function array::sort
    # ......
    # endregion
    function array::sort() {
        # ......
    }
     
    # region - public function array::sortAssoc
    # ......
    # endregion
    function array::sortAssoc() {
        # ......
    }

  5. #5
    Membre Expert
    Avatar de cavo789
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2004
    Messages
    1 797
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 797
    Par défaut
    Impressionnant !



    Je vais exécuter le code sur chacun de mes fichiers, à la main, histoire de m'assurer que tout est correct. Sur mon fichier de test (et comme tu l'as illustré), c'est totalement OK.

  6. #6
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 678
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 678
    Par défaut
    Bonjour,

    les descriptions d'une fonction font ±partie de la fonction, je les mets dans la fonction; je ne les fais pas la précéder.
    quand je vois tes "difficultés", je n'ai pas l'impression de me tromper.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 30/05/2010, 22h31
  2. [XL-2003] Classer les feuilles nommées par ordre alphabétique
    Par macat dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 30/09/2009, 17h07
  3. Réponses: 2
    Dernier message: 29/10/2008, 11h13
  4. [Joomla!] Trier les sections par ordre alphabétique
    Par janclod dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 1
    Dernier message: 20/10/2008, 20h15
  5. Fonction pour trier par ordre alphabétique
    Par brunobzh dans le forum C++
    Réponses: 6
    Dernier message: 18/04/2008, 10h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo