Justement.
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
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
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.
Partager