Può questo può essere fatto in Vim?
Quello che voglio dire è: cercare "BadJob" e sostituirlo con "GoodJob" farebbe le seguenti sostituzioni
'badjob' -> 'goodjob' 'BadJob' -> 'GoodJob' 'badJob' -> 'goodJob' 'BADJOB' -> 'GOODJOB'
Può questo può essere fatto in Vim?
Quello che voglio dire è: cercare "BadJob" e sostituirlo con "GoodJob" farebbe le seguenti sostituzioni
'badjob' -> 'goodjob' 'BadJob' -> 'GoodJob' 'badJob' -> 'goodJob' 'BADJOB' -> 'GOODJOB'
Risposte:
Usa abolish.vim :
:%S/badjob/goodjob/g
BadJobe voglio sostituirla con GoodJob, non posso usare %S/badjob/goodjob/g. Non riesce a rilevare una corrispondenza.
%S/BadJob/GoodJob/gquindi il comando Subvert passerà alla modalità a caso misto e farà tutte le sottostazioni come indicato da OP.
Non so se questo è il tipo di soluzione che stai cercando ... ma l'ho usato: keepcase.vim
Non c'è supporto altrimenti in vim ...
certo che puoi
:s/\cbad/\= strpart(submatch(0), 0 ,1) == toupper(strpart(submatch(0), 0, 1)) ? "GOOD" : "good"/
ps. sto indovinando keepcase.vim incapsula una logica simile :)
:set ignorecase. 2. Badsarà sostituito da GOODinvece di Good. 3. La parte " job" della domanda viene ignorata, quindi sostituirà anche lambada→ lamgooda. Correzioni e spiegazioni per questi bug e alcune altre cose nella mia risposta . (Anche LOLOWLs!)
Puoi semplicemente incollare e adattare questo:
(Certo, se lo fai di tanto in tanto, vorrai un plugin invece di questa mostruosità. Ma per alcuni che hanno fretta e ne hanno bisogno solo una volta, questo è un trucco veloce per il tuo piacere di incollare :)
:%s/\cbad\zejob/\= ( submatch(0)[0] is# toupper(submatch(0)[0]) ? 'G' : 'g' ) . ( submatch(0)[1] is# toupper(submatch(0)[1]) ? 'OOD' : 'ood' )
Oltre al modello di ricerca, devi modificare le quattro 'stringhe 'nel codice sostitutivo: Modifica le parti in grassetto :
:% s / \ c bad \ ze job / \ =
(submatch (0) [0] è # toupper (submatch (0) [0])? ' G ': ' g ').
(submatch (0) [1] è # toupper (submatch (0) [1])? ' OOD ': ' ood ')
Non utilizzare questa versione "arancione" per incollare, poiché anche i suoi caratteri di interruzione di riga interromperanno il comando.
/\zeè lo zucchero sintetico vim regex per contrassegnare un lookahead positivo: il modello dopo \zeviene controllato, ma non sostituito.
is#?? Lasciami spiegare ... (Se interessato.)
#(anche in ==#e altri ) applica la distinzione tra maiuscole e minuscole. Altrimenti, con :set ignorecase(che io uso, perché è necessario per l'utile :set smartcase), vim considererà 'a' == 'A'!!

Per quanto sia folle, dovremmo davvero tenerne conto: poiché dipende dalle impostazioni dell'utente, ==NEVAR dovrebbe essere usato! (Tranne dove sarebbe effettivamente quello che vuoi.) Seguirò anche la raccomandazione da usare ==#per confrontare gli interi: http://learnvimscriptthehardway.stevelosh.com/chapters/22.html#code-defensively
is#invece di ==#un altro modo di codificare in modo difensivo: migliora la sicurezza dei tipi: http://google.github.io/styleguide/vimscriptguide.xml?showone=Type_checking#Type_checking
Dovrebbe essere usato quando si confronta con una stringa letterale.
'single-quoted'invece delle "double quoted" stringhe sono un'altra buona pratica: http://google.github.io/styleguide/vimscriptguide.xml?showone=Strings#Strings
HT @fc. - questa risposta si basa sulla loro risposta , correggendo alcune carenze.
Un'alternativa al plug-in keepcase è SmartCase, che sostituisce le parole mantenendo la custodia originale . (Non lasciarti scoraggiare dalle valutazioni negative.)
:%s/file\A\?size/\=SmartCase("LastModifiedTime")/ig?
:SmartCasecomando. L'ho esteso con il mio fork . Si noti che ciò richiede ingo-library come dipendenza.