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

  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
    Points : 28 119
    Points
    28 119
    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 éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    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?
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  3. #3
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    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 101
    Points : 5 849
    Points
    5 849
    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 éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    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 ...
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  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
    Points : 28 119
    Points
    28 119
    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
    Points : 28 119
    Points
    28 119
    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

  7. #7
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    Par défaut
    Y a pas de miracle pour la coloration syntaxique: il faut qu'il reconnaisse les mots.

    J'ai fait le test avec EOF et c'est beau: il décale d'un alinéa avant et après le here-doc mais ne touche à rien dans le here-doc. J'avais comme hypothèse que le fait que EOF soit en milieu de ligne change quelque chose mais non.

    Test effectué avec emacs 24.3.1 sous Windows.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  8. #8
    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
    Points : 28 119
    Points
    28 119
    Par défaut
    Bon...

    Ça fonctionne avec emacs, si et seulement si les balises here-doc sont bien placées dans le script qu'on lui donne... C'est bien mais pas top comme on dit.

    Bon, et en plus, ca ne fonctionne pas si j'appelle emacs --script, et j'ai un soucis car il utilise des tab au lieu d'espaces...
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  9. #9
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    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 101
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par gangsoleil Voir le message
    j'ai un soucis car il utilise des tab au lieu d'espaces...
    Faut mettre indent-tabs-mode à nil, avec (setq-default indent-tabs-mode nil), par exemple.

    C-h v indent-tabs-mode RET
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    indent-tabs-mode is a variable defined in `C source code'.
    Its value is nil
    Original value was t
     
      Automatically becomes buffer-local when set.
      This variable is safe as a file local variable if its value
      satisfies the predicate `booleanp'.
     
    Documentation:
    Indentation can insert tabs if this is non-nil.

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