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 :

Indentation automatique de shell


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Par défaut Indentation automatique de shell
    Bonjour,

    Je cherche désespérément un outil qui me permettrait d'indenter des scripts shells existants, mais sans succès...

    J'ai essayé des modules vim, mais soit je n'ai pas réussi à m'en servir, soit ils ne fonctionnaient pas, mais dans tous les cas, rien.
    Quant au plugin shell pour eclipse, il est vraiment plus que basique (c'est à peine s'il gère une coloration syntaxique, alors l'indentation....)

    Merci

    [Edit]
    Le plugin vim Super Shell Indent fait par exemple bien son boulot, à un gros détail près : lorsqu'on passe des arguments via "<< !" , il est tout perdu...
    Exemple de mauvais alignement (le ! devrait être en début de ligne) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    #!/bin/ksh
     
    if [ -f test.txt ]
    then
      vi test.txt << ! >> /dev/null 2>&1
      /toto
      2dd
      :x!
      !
     
      echo "traitement fait"
     
    fi

    Alors oui, je pourrai ré-écrire tous les scripts, mais j'en ai vraiment beaucoup trop dans le projet, et je n'ai bien sur pas le temps de tous les modifier pour supprimer ce genre d'appels.
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

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

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

    J'ouvre ton fichier dans emacs:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #!/bin/ksh
     
    if [ -f test.txt ]
    then
    vi test.txt << ! >> /dev/null 2>&1
    /toto
    2dd
    :x!
    !
     
    echo "traitement fait"
     
    fi
    Puis je demande l'indentation, soit en passant sur chaque ligne (à n'importe quel niveau) et en tapant la touche de tabulation; soit en sélectionnant tout le texte et en demandant une indentation par l'appui sur Ctrl + i

    Et 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
    #!/bin/ksh
     
    if [ -f test.txt ]
    then
        vi test.txt << ! >> /dev/null 2>&1
        /toto
        2dd
        :x!
        !
     
        echo "traitement fait"
     
    fi
    Est-ce que cela répond à ton soucis?

  3. #3
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 102
    Par défaut
    Citation Envoyé par Flodelarab Voir le message
    J'ouvre ton fichier dans emacs:
    ...
    Est-ce que cela répond à ton soucis?
    Ben... j'imagine que non! Puisque tu obtiens exactement ce qu'il ne souhaite pas obtenir!

    J'ai aussi ouvert le même fichier avec emacs... et obtenu le même mauvais résultat :-(

    Les lignes entre << ! et la ligne contenant uniquement ! ne devraient pas être indentées.
    Elles constituent ce qu'on appelle généralement un here-doc.

    Si on remplace << ! par << EOF et ! par EOF, alors emacs fait bien le boulot!
    De même, si on utilise EOT ou COUCOU à la place de EOF!
    Plus fort: emacs indente correctement le here-doc (indentation nulle) si on remplace << ! par << "!", ce qui est un indice que que c'est peut-être à cause de la variable sh-here-doc-open-re et de la valeur '_' associée à '!' dans la syntaxe-table...

    (J'ai cru un instant que c'était lié à la valeur de sh-here-document-word (qui vaut "EOF"), mais ce n'est pas le cas.)

    En fait, avec le "!", emacs ne reconnaît pas le here-doc ainsi qu'en atteste la coloration syntaxique,
    ce que l'on peut aussi vérifier en plaçant le point à l'intérieur du here-doc et en tapant M-: (face-at-point) RET qui ne retourne pas "sh-heredoc", mais "default".

    L'en-tête du fichier "sh-script.el" indique que la gestion des here-doc est l'une des difficultés rencontrées par les développeurs de ce module...

    Emacs bug report!

    Pour contourner le bug emacs, une possibilité pratique serait de faire une passe de sed -i -e 's/<< [!]/<< "!"/' sur tous les fichiers!
    Attention! le "-i" édite le fichier! Faire une copie de sauvegarde et vérifier que tout va bien avant de l'appliquer à tous les scripts!
    C'est plus simple que de remplacer << ! par << EOF et ! par EOF car il n'y a qu'une seule ligne à changer.

    Rq: j'ai écrit << [!] et non << ! pour se préserver contre le cas où le script de modification s'appliquerait à lui-même!!! (même astuce que pour le fameux ps | egrep '[m]on_process')

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 288
    Par défaut
    Bravo pour cette précision.

    Mais faut pas être malin pour utiliser le point d'exclamation comme délimiteur. C'est comme utiliser le dollar ou le point virgule...

    Si au moins il avait mis une espace fine insécable devant ...

  5. #5
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Par défaut
    Citation Envoyé par Flodelarab Voir le message
    Mais faut pas être malin pour utiliser le point d'exclamation comme délimiteur. C'est comme utiliser le dollar ou le point virgule...
    Si c'était moi qui avait écrit ça, j'aurai tout fait pour l'éviter, et au pire j'aurai utilisé EOF

    Merci pour vos réponses, je vais voir si je peux facilement remplacer les ! par "!" ou par EOF ou un truc du genre, et si dans ce cas ça fonctionne mieux.
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  6. #6
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Par défaut
    Bon, alors le fait de remplacer les ! par "!" ou par EOF ne changent rien dans Super Shell Indent...

    Et dans emacs, ça ne fait simplement rien... c'est à dire qu'il indente bien le code jusqu'au here-doc, et après il n'indente plus, que ce soit EOF, ! ou "!"...

    testé sur emacs 23.1.1

    Rien de concluant pour le moment donc, mais je continue à chercher, ou à tester ce qui fonctionne chez vous
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

Discussions similaires

  1. [Emacs] Indentation automatique
    Par Bicnic dans le forum Autres EDI
    Réponses: 9
    Dernier message: 13/06/2012, 23h14
  2. [INDENTATION] Automatique
    Par divxdede dans le forum EDI et Outils pour Java
    Réponses: 3
    Dernier message: 15/03/2007, 10h29
  3. Indentation automatique code PL/SQL
    Par Elise78 dans le forum PL/SQL
    Réponses: 5
    Dernier message: 12/02/2007, 15h23
  4. [JDevelopper] Comment indenter automatiquement le code ??
    Par Bicnic dans le forum JDeveloper
    Réponses: 5
    Dernier message: 03/08/2004, 21h11
  5. indentation automatique
    Par Boosters dans le forum JBuilder
    Réponses: 3
    Dernier message: 17/07/2003, 16h44

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