Peut cela peut se faire dans vim?
Ce que je veux dire, c'est: rechercher «BadJob» et le remplacer par «GoodJob» ferait les remplacements suivants
'badjob' -> 'goodjob' 'BadJob' -> 'GoodJob' 'badJob' -> 'goodJob' 'BADJOB' -> 'GOODJOB'
Peut cela peut se faire dans vim?
Ce que je veux dire, c'est: rechercher «BadJob» et le remplacer par «GoodJob» ferait les remplacements suivants
'badjob' -> 'goodjob' 'BadJob' -> 'GoodJob' 'badJob' -> 'goodJob' 'BADJOB' -> 'GOODJOB'
Réponses:
Utilisez abolish.vim :
:%S/badjob/goodjob/g
BadJob
et que je veux le remplacer par GoodJob
, je ne peux pas l'utiliser %S/badjob/goodjob/g
. Il ne parvient pas à détecter une correspondance.
%S/BadJob/GoodJob/g
alors la commande Subvert passera en mode casse mixte et effectuera toutes les sous-stations comme indiqué par OP.
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 autrement dans vim ...
sûr que tu peux
:s/\cbad/\= strpart(submatch(0), 0 ,1) == toupper(strpart(submatch(0), 0, 1)) ? "GOOD" : "good"/
ps. Je suppose que keepcase.vim encapsule une logique similaire :)
:set ignorecase
. 2. Bad
sera remplacé par GOOD
au lieu de Good
. 3. La job
partie " " de la question est ignorée, elle remplacera donc également lambada
→ lamgooda
. Corrections et explications de ces bugs et quelques autres choses dans ma réponse . (Aussi LOLOWLs!)
Vous pouvez simplement coller et adapter ceci:
(Bien sûr, si vous faites cela de temps en temps, vous voudrez un plugin au lieu de cette monstruosité. Mais pour certains qui sont pressés et n'en ont besoin qu'une seule 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 éditer les quatre '
chaînes '
du code de remplacement: Modifiez les parties en gras :
:% s / \ c mauvais \ ze job / \ =
(sous-correspondance (0) [0] est # toupper (sous-correspondance (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 saut de ligne interrompront également la commande.
/\ze
est un sucre syntaxique vim regex pour marquer une anticipation positive: Le modèle après \ze
est vérifié, mais pas remplacé.
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'utile :set smartcase
), vim prendra en compte 'a' == 'A'
!!
Aussi fou que cela soit, nous devrions vraiment en tenir compte: comme il dépend des paramètres de l'utilisateur, ==
si NEVAR doit être utilisé! (Sauf là où ce serait réellement ce que vous voulez.) Je suivrai même la recommandation à utiliser ==#
lors de la comparaison des entiers: http://learnvimscriptthehardway.stevelosh.com/chapters/22.html#code-defensively
is#
au lieu de ==#
est une autre façon de coder défensivement: Cela 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 une chaîne littérale.
'single-quoted'
au lieu de "double quoted"
chaînes sont une autre bonne pratique: http://google.github.io/styleguide/vimscriptguide.xml?showone=Strings#Strings
HT @fc. - cette réponse s'appuie sur leur réponse , corrigeant quelques lacunes.
Une alternative au plugin keepcase est SmartCase - remplacer les mots tout en conservant la casse d'origine . (Ne vous laissez pas décourager par les mauvaises notes.)
:%s/file\A\?size/\=SmartCase("LastModifiedTime")/ig
?
:SmartCase
commande. J'ai étendu cela dans ma propre fourchette . Notez que cela nécessite ingo-library en tant que dépendance.