Précédent   Forum des professionnels en informatique > Systèmes > Linux > Applications
Applications Questions sur l'utilisation d'applications, du shell, et des interfaces graphiques (KDE, Gnome, XFCE... )
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 28/03/2006, 10h24   #1
Membre du Club
 
Inscription : mai 2004
Messages : 68
Détails du profil
Informations personnelles :
Âge : 30
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2004
Messages : 68
Points : 63
Points : 63
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 :
1
2
3
f("toto") = g("toto");
f("titi") = g("titi");
f("tata") = g("tata");
avec gvim, en faisant successivement

Code :
1
2
:%s/^/f("/
:%s/$/");/
j'arrive a obtenir

Code :
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/^.*$/f("XXX") = g("XXX");/
J'espère avoir été clair, merci d'avance...
romain69005 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/03/2006, 10h29   #2
Membre éprouvé
 
Avatar de bster
 
Inscription : mai 2005
Messages : 373
Détails du profil
Informations personnelles :
Âge : 35
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : mai 2005
Messages : 373
Points : 469
Points : 469
oui presque

Code :
:%s/^.*/f\(\"&\"\)\ \=\g\(\"&\"\)/
mais attention aux lignes vides avec le .* de la selection

Code :
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...
__________________
Comité de lutte contre le langage SMS sur les forums
Veuillez écrire dans un langage compréhensible par les humains, merci.
bster est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/03/2006, 10h39   #3
Membre du Club
 
Inscription : mai 2004
Messages : 68
Détails du profil
Informations personnelles :
Âge : 30
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2004
Messages : 68
Points : 63
Points : 63
C'est exactement ce dont j'avais besoin, merci beaucoup !

edit : et merci pour la précision concernent les \
romain69005 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/03/2006, 10h46   #4
Membre éprouvé
 
Avatar de bster
 
Inscription : mai 2005
Messages : 373
Détails du profil
Informations personnelles :
Âge : 35
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : mai 2005
Messages : 373
Points : 469
Points : 469
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
__________________
Comité de lutte contre le langage SMS sur les forums
Veuillez écrire dans un langage compréhensible par les humains, merci.
bster est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/03/2006, 10h50   #5
Membre Expert
 
Avatar de Gnux
 
Inscription : juillet 2003
Messages : 2 055
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 2 055
Points : 2 007
Points : 2 007
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
Gnux est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/03/2006, 10h55   #6
Membre du Club
 
Inscription : mai 2004
Messages : 68
Détails du profil
Informations personnelles :
Âge : 30
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2004
Messages : 68
Points : 63
Points : 63
Merci pour le conseil, je regarderai ca dès ce soir
romain69005 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/03/2006, 23h58   #7
Expert Confirmé Sénior

 
Avatar de Luc Hermitte
 
Inscription : août 2003
Messages : 4 323
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : août 2003
Messages : 4 323
Points : 5 121
Points : 5 121
Code :
:%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 :
1
2
:let cmd = 's#\S.*\S\ze\s*$#f("&") = g("&");#'
:%exe cmd
__________________
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.
Luc Hermitte est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/03/2006, 07h39   #8
Membre éprouvé
 
Avatar de bster
 
Inscription : mai 2005
Messages : 373
Détails du profil
Informations personnelles :
Âge : 35
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : mai 2005
Messages : 373
Points : 469
Points : 469
Citation:
Envoyé par Luc Hermitte
Code :
:%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 :
1
2
:let cmd = 's#\S.*\S\ze\s*$#f("&") = g("&");#'
:%exe cmd
sauf que ça ne marche pas partout ta solution
__________________
Comité de lutte contre le langage SMS sur les forums
Veuillez écrire dans un langage compréhensible par les humains, merci.
bster est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/03/2006, 10h02   #9
Expert Confirmé Sénior

 
Avatar de Luc Hermitte
 
Inscription : août 2003
Messages : 4 323
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : août 2003
Messages : 4 323
Points : 5 121
Points : 5 121
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) ?
__________________
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.
Luc Hermitte est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/03/2006, 10h06   #10
Membre éprouvé
 
Avatar de bster
 
Inscription : mai 2005
Messages : 373
Détails du profil
Informations personnelles :
Âge : 35
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : mai 2005
Messages : 373
Points : 469
Points : 469
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
__________________
Comité de lutte contre le langage SMS sur les forums
Veuillez écrire dans un langage compréhensible par les humains, merci.
bster est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/03/2006, 10h19   #11
Expert Confirmé Sénior

 
Avatar de Luc Hermitte
 
Inscription : août 2003
Messages : 4 323
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : août 2003
Messages : 4 323
Points : 5 121
Points : 5 121
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.
__________________
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.
Luc Hermitte est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/03/2006, 10h23   #12
Membre éprouvé
 
Avatar de bster
 
Inscription : mai 2005
Messages : 373
Détails du profil
Informations personnelles :
Âge : 35
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : mai 2005
Messages : 373
Points : 469
Points : 469
mouais pas convaicu le standard c'est le standard...
__________________
Comité de lutte contre le langage SMS sur les forums
Veuillez écrire dans un langage compréhensible par les humains, merci.
bster est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/03/2006, 10h47   #13
Membre du Club
 
Inscription : mai 2004
Messages : 68
Détails du profil
Informations personnelles :
Âge : 30
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2004
Messages : 68
Points : 63
Points : 63
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 ?
romain69005 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/03/2006, 10h53   #14
Membre éprouvé
 
Avatar de bster
 
Inscription : mai 2005
Messages : 373
Détails du profil
Informations personnelles :
Âge : 35
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : mai 2005
Messages : 373
Points : 469
Points : 469
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 :
__________________
Comité de lutte contre le langage SMS sur les forums
Veuillez écrire dans un langage compréhensible par les humains, merci.
bster est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/03/2006, 10h56   #15
Membre du Club
 
Inscription : mai 2004
Messages : 68
Détails du profil
Informations personnelles :
Âge : 30
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2004
Messages : 68
Points : 63
Points : 63
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
romain69005 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/03/2006, 01h09   #16
Expert Confirmé Sénior

 
Avatar de Luc Hermitte
 
Inscription : août 2003
Messages : 4 323
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : août 2003
Messages : 4 323
Points : 5 121
Points : 5 121
Justement.
Code :
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 :
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 :
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.
__________________
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.
Luc Hermitte est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/03/2006, 10h17   #17
Membre du Club
 
Inscription : mai 2004
Messages : 68
Détails du profil
Informations personnelles :
Âge : 30
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2004
Messages : 68
Points : 63
Points : 63
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 )
romain69005 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/03/2006, 10h54   #18
Membre Expert
 
Avatar de narmataru
 
Inscription : décembre 2002
Messages : 1 423
Détails du profil
Informations personnelles :
Âge : 31
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations forums :
Inscription : décembre 2002
Messages : 1 423
Points : 1 491
Points : 1 491
Citation:
Envoyé par Luc Hermitte
Justement.
Code :
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 :
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 :
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 !
__________________
Reportage d'Arte sur Linux
narmataru est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/03/2006, 00h58   #19
Expert Confirmé Sénior

 
Avatar de Luc Hermitte
 
Inscription : août 2003
Messages : 4 323
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : août 2003
Messages : 4 323
Points : 5 121
Points : 5 121
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.
__________________
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.
Luc Hermitte est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 02h31.


 
 
 
 
Partenaires

Hébergement Web