72 votes

Effectuer une recherche/remplacement non-regex dans vim

Lorsque je fais des recherches/remplacements dans vim, je n'ai presque jamais besoin d'utiliser les regex, donc c'est une douleur de devoir constamment tout échapper. Y a-t-il un moyen de faire en sorte que les regex ne soient pas utilisés par défaut ou y a-t-il une commande alternative pour accomplir cela ?

Par exemple, si je veux remplacer < con &lt; J'aimerais juste pouvoir taper s/</&lt;/g au lieu de s/\</\&lt\;/g

2 votes

Vous ne devriez pas avoir à vous échapper < en premier lieu. En dehors de ça, je ne pense pas qu'il y ait un moyen de rendre & travailler littéralement.

0 votes

Vous devriez envisager d'accepter la réponse de bjunix. La réponse acceptée ne répond pas réellement à la question - il s'agit plus d'une critique que d'une réponse.

0 votes

@KolobCanyon merci, je l'ai fait.

110voto

bjunix Points 1465

Pour le :s il existe un raccourci pour désactiver ou forcer la magie. Pour désactiver la magie, utilisez :sno comme :

:sno/search_string/replace_string/g

Trouvé ici : http://vim.wikia.com/wiki/Simplifying_regular_expressions_using_magic_and_no-magic

9 votes

Désactiver la magie laisse toujours une signification spéciale aux caractères "$" et "\".

2 votes

Je trouve très étrange que l'expression rationnelle soit la valeur par défaut dans VIM. Il est beaucoup plus courant d'effectuer une recherche et un remplacement sans regex. Je finis par utiliser Ctrl + Shift + H à cause de ça. Je suppose que c'est une autre raison pour laquelle je dois devenir bon en regex.

0 votes

@KolobCanyon, qu'est-ce que le Ctrl + Shift + H faire ?

22voto

spektom Points 11130

Utilisez cette option :

set nomagic

Ver :help /magic

2 votes

Cela n'aide pas dans ce cas particulier. Mais cela peut aider en général. +1

2 votes

@Tomalak -- Je ne sais pas pourquoi vous dites que cela n'aide pas dans ce cas. Le réglage sur nomagic semble bien fonctionner pour moi. Ensuite, lancez la commande :s/</&lt;/g et cela fonctionne comme souhaité. Ce n'est pas une solution idéale, puisque vous voulez généralement que la magie opère, je pense, mais cela fonctionne.

0 votes

@Herbert J'ai essayé avec l'option \M qui est censée être la même chose que nomagic (mais sur une base par-regex), mais évidemment nomagic change la façon dont & se comporte dans le remplacement, tandis que \M ne le fait pas. C'est aussi pourquoi j'ai pensé que faire & littéral serait difficile.

16voto

Herbert Sitz Points 10657

Le problème est principalement dû à une confusion sur le rôle de la Commission européenne. & dans la chaîne de remplacement. La chaîne de remplacement est no un reg-ex, bien qu'il possède quelques caractères spéciaux, comme & . Vous pouvez lire sur le rôle de & en chaîne de remplacement ici : :h sub-replace-special .

Je pense que le principal problème pour le PO n'est pas nécessairement de taper les antislashs supplémentaires, mais plutôt de se souvenir quand un antislash est nécessaire et quand il ne l'est pas. Une solution pourrait être de commencer à utiliser des "expressions de remplacement" en cas de doute. ( Voir :h sub-replace-expression .) Cela nécessite de mettre un `\=' dans la chaîne de remplacement mais pour certaines personnes, cela peut vous donner un contrôle plus naturel sur ce qui est substitué, puisque mettre une chaîne littérale entre guillemets simples vous donnera la chaîne de remplacement que vous voulez. Par exemple, ce substitut fait ce que le PO veut :

:s/</\='&lt;'/g

0 votes

La bien meilleure réponse pour la recherche/remplacement en texte clair est ci-dessous. :sno plutôt que :s désactive le regex.

0 votes

"taper les antislashs supplémentaires" ? Avez-vous déjà utilisé le copier-coller ? Lorsque vous avez le texte que vous voulez rechercher dans le presse-papiers, le fait de devoir aller chercher ses caractères d'échappement est un inconvénient majeur ! Oui, vous pouvez taper une commande d'échappement étrange mais il est absurde de devoir se donner tant de mal au lieu que le programme fournisse une fonctionnalité aussi basique ! Et j'adore les regex mais parfois elles ne sont pas la bonne solution !

3voto

Christian Brabandt Points 2241

Si vous souhaitez effectuer une recherche littérale, vous pouvez utiliser la fonction \V regex atom. Cela fait presque ce que vous voulez, sauf que vous devez également échapper la barre oblique inverse. Vous pourriez définir votre propre commande de recherche, qui effectuerait une recherche littérale. Quelque chose comme ça :

 :com! -nargs=1 Search :let @/='\V'.escape(<q-args>, '\/')| normal! n

Et ensuite utiliser :Search /foobar/baz

Pour Substitute, vous pourriez alors, après une commande :Search, simplement utiliser

:%s//replace/g

car alors Vim reprendrait implicitement le dernier élément de recherche et l'utiliserait pour le remplacement.

(Je veux juste vous donner quelques idées)

0 votes

Super, merci, c'est la seule réponse qui m'aide à remplacer. tout le texte, y compris les chemins d'accès avec des antislashes. Je n'arrive pas à croire que vim ne dispose pas encore d'une fonction de recherche en texte brut, comment peut-on prétendre que l'on va échapper tous les backslashes (ou faire manuellement une commande étrange comme celle-ci) avant de commencer à faire une substitution ? La plupart du temps, cela me prendrait moins de temps de remplacer chaque occurrence manuellement ! !! Et j'adore les expressions régulières, c'est juste que parfois vous DEVEZ les éviter !

0 votes

Il est préférable de mentionner que le texte de remplacement interprète également certains caractères de manière spéciale, de sorte que la plupart des gens voudront probablement utiliser :%s//\='replace'/g comme suggéré dans la réponse acceptée (puisque j'y suis, la plupart du temps, vous voudrez probablement ajouter un drapeau 'c' également). :%s//\='replace'/gc ).

0voto

Taufik Nurrohman Points 572

Voici comment désactiver la recherche/remplacement d'expressions régulières uniquement en mode commande :

autocmd CmdWinEnter * set nomagic
autocmd CmdWinLeave * set magic

Tous les plugins qui dépendent de l'expression régulière, comme le suppresseur d'espaces blancs, devraient fonctionner comme d'habitude.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X