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

Applications et environnements graphiques Discussion :

Substitutions avec gvim


Sujet :

Applications et environnements graphiques

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    68
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2004
    Messages : 68
    Par défaut Substitutions avec gvim
    Bonjour à tous,

    J'espere que ma question est au bon endroit

    Voila mon probleme : j'ai une liste de valeurs :

    et j'aimerais arriver au résultat suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    f("toto") = g("toto");
    f("titi") = g("titi");
    f("tata") = g("tata");
    avec gvim, en faisant successivement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    :%s/^/f("/
    :%s/$/");/
    j'arrive a obtenir

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    f("toto");
    f("titi");
    f("tata");
    mais je ne sais pas comment obtenir le résultat souhaité

    Existe t'il une commande de ce style ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    :%s/^.*$/f("XXX") = g("XXX");/
    J'espère avoir été clair, merci d'avance...

  2. #2
    Membre chevronné
    Avatar de bster
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    372
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2005
    Messages : 372
    Par défaut
    oui presque

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    :%s/^.*/f\(\"&\"\)\ \=\g\(\"&\"\)/
    mais attention aux lignes vides avec le .* de la selection

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    f("toto") = g("toto")
    f("") = g("")
    ~
    bon là j'ai oublié le ; avant le dernier / mais c'est tout....

    le & repose ce qui est pris à substituer

    les \ protegent les caracteres de poctuation et de coding de toute interpretation puisqu'ils doivent etre traites en caractere et non en commande...

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    68
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2004
    Messages : 68
    Par défaut
    C'est exactement ce dont j'avais besoin, merci beaucoup !

    edit : et merci pour la précision concernent les \

  4. #4
    Membre chevronné
    Avatar de bster
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    372
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2005
    Messages : 372
    Par défaut
    quand on goute à vi on ne peut plus s'en passer c'est ce qu'il y a de mieux...

    ta future bible / ton livre de chevet

  5. #5
    Membre Expert

    Homme Profil pro
    Inscrit en
    Juillet 2003
    Messages
    2 075
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations forums :
    Inscription : Juillet 2003
    Messages : 2 075
    Par défaut
    Citation Envoyé par bster
    quand on goute à vi on ne peut plus s'en passer c'est ce qu'il y a de mieux...

    ta future bible / ton livre de chevet
    Intéressant ce lien

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    68
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2004
    Messages : 68
    Par défaut
    Merci pour le conseil, je regarderai ca dès ce soir

  7. #7
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 308
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    :%s#\S.*\S\ze\s*$#f("&") = g("&");#
    Cela gardera l'indentation (au pire, un ":%normal! ==" réindentera tout) et ne rajoutera pas d'espaces superflus.

    Pourquoi tous ces backslashs ?
    Même si c'est à progammer (pour exécuter via exe), il suffit de les rajouter automatiquement et au dernier moment avec escape(). Et je n'en vois aucun à mettre ici:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    :let cmd = 's#\S.*\S\ze\s*$#f("&") = g("&");#'
    :%exe cmd
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  8. #8
    Membre chevronné
    Avatar de bster
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    372
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2005
    Messages : 372
    Par défaut
    Citation Envoyé par Luc Hermitte
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    :%s#\S.*\S\ze\s*$#f("&") = g("&");#
    Cela gardera l'indentation (au pire, un ":%normal! ==" réindentera tout) et ne rajoutera pas d'espaces superflus.

    Pourquoi tous ces backslashs ?
    Même si c'est à progammer (pour exécuter via exe), il suffit de les rajouter automatiquement et au dernier moment avec escape(). Et je n'en vois aucun à mettre ici:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    :let cmd = 's#\S.*\S\ze\s*$#f("&") = g("&");#'
    :%exe cmd
    sauf que ça ne marche pas partout ta solution

  9. #9
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 308
    Par défaut
    O_o
    Qu'appelles-tu partout ? J'écris ce genre de choses pour vim (puisque le sujet parles explicitement de gvim) sous linux, windows et solaris sans difficultées.
    Et a priori, ce n'est même pas lié au réglage de 'magic' vu que tu backslashais aussi la chaine de remplacement. C'est pour ceux qui tournent toujours en mode compatible (je n'en ai encore jamais compris l'intérêt) ?
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  10. #10
    Membre chevronné
    Avatar de bster
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    372
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2005
    Messages : 372
    Par défaut
    toute la branche BSD, TRU64, SCO, HPUX AIX ...etc....ainsi que certains linux
    c'est aussi vrai pour la nouvelle version de vim 7.xx (actuellement dispo en beta seulement)....

    en mode VIM (pas vi) ça ne passe pas et à forciori sous vi standard.

    ça ne marche pas nom plus en mode scripting (-c) de vi, ni vim....même sous linux

  11. #11
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 308
    Par défaut
    Que te renvoie :version ?

    Pour le mode scripting, c'est normal qu'il faille banaliser la chaine pour que le shell ne la transforme pas. Et encore, en passant via perl, ou en utilisant des tableaux, il doit y avoir moyen de ne pas banaliser les guillemets.
    Depuis vim, tu n'as aucune raison de banaliser les caractères de remplacement -- en particulier espace, parenthèses et =. Seuls des trucs comme \ze peuvent ne pas être conus en mode compatible.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  12. #12
    Membre chevronné
    Avatar de bster
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    372
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2005
    Messages : 372
    Par défaut
    mouais pas convaicu le standard c'est le standard...

  13. #13
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    68
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2004
    Messages : 68
    Par défaut
    Je ne pensais pas déclencher une polémique

    Merci Luc Hermitte, cette solution marche chez moi.

    Si j'ai bien compris, tu substitues à partir du premier caractere "non blanc", jusqu'au dernier de la ligne, tu stoppes à ce niveau la, et tu inclus les caracteres blanc de la fin de la ligne après le \ze pour qu'ils soient effacée...

    J'ai juste ?

    Visiblement, au lieu de faire

    tu fais
    Pour quelle raison ?

  14. #14
    Membre chevronné
    Avatar de bster
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    372
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2005
    Messages : 372
    Par défaut
    C'est pas polemique mais une question de détails car ça ne marche pas partout il faut rester en standard c'est tout... et eviter les solutions non-viable-partout... mais ce n'est qu'un avis personel rien de plus ...

    de plus nous sommes (me semble t il ) resté cordiaux non :

  15. #15
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    68
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2004
    Messages : 68
    Par défaut
    Citation Envoyé par bster
    de plus nous sommes (me semble t il ) resté cordiaux non :
    Oui oui, bien sur.

    C'est simplement que je ne pensais pas que mon petit probleme de débutant allait déboucher sur des questions qui me dépassent completement

  16. #16
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 308
    Par défaut
    Justement.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    :h :substitute
    :h string-match
    :h sub-replace-special
    Le dernier indique clairement quels sont les caractères qui doivent être backslashés dans la chaine de remplacement. C'est exactement le même principe avec sed ou perl.
    En particulier, tu verras qu'utiliser \= en début de chaine de remplacement aura des effets particuliers. Essaies donc ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    :let toto=1
    itutu<esc>
    :s/ut/\=toto
    (la deuxième ligne, c'est pour dire qu'il y a "tutu" dans la ligne courante du buffer courant)

    Pour en revenir au mode scripting externe, il faut bien voir que taper ce qui suit sous bash
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gvim tutu.txt -c :s/ut/t"at"4\e2
    c'est comme taper la même chose, dans vim, sans les guillemets, ni le backslash. Les paramètres sont d'abord interprétés par le shell, ici ils n'arrivent jamais jusqu'à l'exécutable. Il est vite fait d'écrire un script shell, ou un prog en C ou C++ pour afficher les paramètres véritablement reçus par l'exécutable invoqué depuis le shell.
    Pour avoir quelque chose qui soit équivalent à ce que tu tapes sous vim, il faudrait doubler le backslash, et banaliser le guillemet.

    Si vim se comportait comme tu l'attendais, c'est parce qu'il ignore les backslashs superflus. Ils ne seraient véritablement pris en compte que si ils correspondaient à un des cas documentés dans |sub-replace-special|.


    Et effectivement, on est parfaitement cordiaux. Je suis parfaitement d'accord avec son approche de faire des trucs portables (je fais parti de ceux qui se prennent le choux à faire des plugins tournant sous *nix comme sous windows -- je méprise juste ceux qui tournent en mode compatible pour lesquels la notion de plugin n'existe de toutes façons même pas), c'est juste que nous n'avons visiblement pas la même lecture de la doc de vim. 8)


    Concernant \ze, c'est un marqueur propre à vim (:h /\ze) utilisé pour définir que tout ce qui suit est considéré comme ne faisant pas parti de la chaine qui a été matchée par le motif de recherche.

    Pour s/pat/repl/, s#pat#repl#, s§pat§repl§, ..., ce n'est qu'une question de goûts, et parfois de praticité. Quand un caractère comme le slash intervient dans le pattern ou dans la chaine de remplacement, on évite de l'utiliser comme délimiteur entre les paramètres de :substitute. Pareil que sed et les autres.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  17. #17
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    68
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2004
    Messages : 68
    Par défaut
    Merci beaucoup d'avoir pris le temps de m'expliquer tout ca, je commence à mieux cerner les possibilités et les subtilités de ce simple (?) ":s" !

    (et vous m'avez fait gagner un temps fou en répondant à ma question initiale )

  18. #18
    Membre Expert
    Avatar de narmataru
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    1 548
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 548
    Par défaut
    Citation Envoyé par Luc Hermitte
    Justement.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    :h :substitute
    :h string-match
    :h sub-replace-special
    Le dernier indique clairement quels sont les caractères qui doivent être backslashés dans la chaine de remplacement. C'est exactement le même principe avec sed ou perl.
    En particulier, tu verras qu'utiliser \= en début de chaine de remplacement aura des effets particuliers. Essaies donc ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    :let toto=1
    itutu<esc>
    :s/ut/\=toto
    (la deuxième ligne, c'est pour dire qu'il y a "tutu" dans la ligne courante du buffer courant)

    Pour en revenir au mode scripting externe, il faut bien voir que taper ce qui suit sous bash
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gvim tutu.txt -c :s/ut/t"at"4\e2
    c'est comme taper la même chose, dans vim, sans les guillemets, ni le backslash. Les paramètres sont d'abord interprétés par le shell, ici ils n'arrivent jamais jusqu'à l'exécutable. Il est vite fait d'écrire un script shell, ou un prog en C ou C++ pour afficher les paramètres véritablement reçus par l'exécutable invoqué depuis le shell.
    Pour avoir quelque chose qui soit équivalent à ce que tu tapes sous vim, il faudrait doubler le backslash, et banaliser le guillemet.

    Si vim se comportait comme tu l'attendais, c'est parce qu'il ignore les backslashs superflus. Ils ne seraient véritablement pris en compte que si ils correspondaient à un des cas documentés dans |sub-replace-special|.


    Et effectivement, on est parfaitement cordiaux. Je suis parfaitement d'accord avec son approche de faire des trucs portables (je fais parti de ceux qui se prennent le choux à faire des plugins tournant sous *nix comme sous windows -- je méprise juste ceux qui tournent en mode compatible pour lesquels la notion de plugin n'existe de toutes façons même pas), c'est juste que nous n'avons visiblement pas la même lecture de la doc de vim. 8)


    Concernant \ze, c'est un marqueur propre à vim (:h /\ze) utilisé pour définir que tout ce qui suit est considéré comme ne faisant pas parti de la chaine qui a été matchée par le motif de recherche.

    Pour s/pat/repl/, s#pat#repl#, s§pat§repl§, ..., ce n'est qu'une question de goûts, et parfois de praticité. Quand un caractère comme le slash intervient dans le pattern ou dans la chaine de remplacement, on évite de l'utiliser comme délimiteur entre les paramètres de :substitute. Pareil que sed et les autres.
    maitre vi de www.developpez.com
    Je me rend compte que j'utilise vi à 0,05% de ses capacités !

  19. #19
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 308
    Par défaut
    Citation Envoyé par narmataru
    maitre vi de www.developpez.com
    Je me rend compte que j'utilise vi à 0,05% de ses capacités !
    vi. Non.
    Et je doute qu'il y ait beaucoup de monde qui maitrise cette bête à plus de 70%.

    Quant à :substitute, il s'agit de la commande qui a fait que je me suis, difficilement, attaché à vi. Cette commande est énorme. Les besoins grandissant, je suis passé à vim.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

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

Discussions similaires

  1. Substitution avec des hash
    Par gbauby dans le forum Langage
    Réponses: 1
    Dernier message: 20/05/2012, 18h13
  2. [regex] substitution avec sed
    Par tiresias54 dans le forum Linux
    Réponses: 6
    Dernier message: 26/04/2012, 17h26
  3. [sed ou bash] substitution avec des '/'
    Par pfxxx dans le forum Linux
    Réponses: 2
    Dernier message: 17/08/2010, 15h17
  4. Réponses: 2
    Dernier message: 22/03/2007, 12h01
  5. substitution String avec regex, possible ?
    Par kalou dans le forum Collection et Stream
    Réponses: 13
    Dernier message: 17/01/2007, 00h52

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