Substitut conservateur dans Vim

Est- ce que cela peut être fait dans Vim?

Ce que je veux dire, c’est que la recherche de «BadJob» et son remplacement par «GoodJob» feraient les remplacements suivants

'badjob' -> 'goodjob' 'BadJob' -> 'GoodJob' 'badJob' -> 'goodJob' 'BADJOB' -> 'GOODJOB' 

Utilisez abolish.vim :

 :%S/badjob/goodjob/g 

Je ne sais pas si c’est le genre de solution que vous recherchez … mais j’ai utilisé ceci: keepcase.vim

Il n’y a pas de support sinon dans vim …

Sûr que tu peux

:s/\cbad/\= strpart(submatch(0), 0 ,1) == toupper(strpart(submatch(0), 0, 1)) ? "GOOD" : "good"/

ps. Je pense que keepcase.vim encapsule une logique similaire 🙂

Vous pouvez simplement coller et adapter ceci:
(Bien sûr, si vous faites cela de temps en temps, vous voudrez un plug-in au lieu de cette monstruosité. Mais pour ceux qui sont pressés et n’en ont besoin qu’une fois, c’est un hack rapide pour votre plaisir de coller 🙂

:%s/\cbad\zejob/\= ( submatch(0)[0] is# toupper(submatch(0)[0]) ? 'G' : 'g' ) . ( submatch(0)[1] is# toupper(submatch(0)[1]) ? 'OOD' : 'ood' )

Outre le modèle de recherche, vous devez modifier les quatre ' chaînes ' dans le code de remplacement: Modifiez les parties en gras :

:% s / \ c bad \ ze job / \ =
(submatch (0) [0] est # toupper (submatch (0) [0])? ‘ G ‘: ‘ g ‘).
(submatch (0) [1] est # toupper (submatch (0) [1])? ‘ OOD ‘: ‘ ood ‘)

N’utilisez pas cette version “orange” pour coller, car ses caractères de retour à la ligne interrompront également la commande.

/\ze est le sucre syntaxique vim regex pour marquer un lookahead positif: le motif après \ze est vérifié, mais pas substitué.

is# ?? Laissez-moi vous expliquer… (si vous êtes intéressé.)

# (également dans ==# et autres ) applique la sensibilité à la casse. Sinon, avec :set ignorecase (que j’utilise, car cela est nécessaire pour l’utilitaire :set smartcase ), vim considérera 'a' == 'A' !!

Aussi fou que cela soit, nous devrions vraiment en tenir compte: Parce que cela dépend des parameters de l’utilisateur, == si NEVAR devait être utilisé! (Sauf là où ce serait réellement ce que vous voulez.) Je vais même suivre la recommandation d’utiliser ==# lorsque l’on compare des nombres entiers: http://learnvimscriptthehardway.stevelosh.com/chapters/22.html#code-defensively

is# au lieu de ==# est une autre méthode de codage défensif: elle améliore la sécurité des types: http://google.github.io/styleguide/vimscriptguide.xml?showone=Type_checking#Type_checking
Il doit être utilisé lors de la comparaison avec un littéral de chaîne.

'single-quoted' place des "double quoted" sont une autre bonne pratique: http://google.github.io/styleguide/vimscriptguide.xml?showone=Ssortingngs#Ssortingngs

HT @fc. – Cette réponse se base sur leur réponse , en corrigeant quelques lacunes.

SmartCase est une alternative au plugin keepcase: il remplace les mots tout en conservant la casse d’origine . (Ne vous laissez pas décourager par les mauvaises notes.)

Si vous ne faites correspondre qu’une chaîne exacte (indépendante de la casse) avec quelques capitalisations possibles, une autre possibilité est:

 :s/abc/\={'abc':'xyz','Abc','Xyz'}[submatch(0)]/i