Sostituto preservare caso in Vim


154

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'

16
Questa dovrebbe essere una funzione vim. Ha molto senso.
Bach,

Risposte:


120

Usa abolish.vim :

:%S/badjob/goodjob/g

13
Non meritiamo Tim Pope.
Andrew Keeton

1
Questo plugin non sembra funzionare per me. Se una parola mi piace BadJobe voglio sostituirla con GoodJob, non posso usare %S/badjob/goodjob/g. Non riesce a rilevare una corrispondenza.
Roymunson,

@Roymunson Quello che devi fare è questo:, %S/BadJob/GoodJob/gquindi il comando Subvert passerà alla modalità a caso misto e farà tutte le sottostazioni come indicato da OP.
shivams,

28

Non so se questo è il tipo di soluzione che stai cercando ... ma l'ho usato: keepcase.vim

Non c'è supporto altrimenti in vim ...


11

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 :)


Sì, fa dal 2007:% SubstituteCase / \ cbadjob / GoodJob / g ^^
Luc Hermitte,

Cosa significa gVim 7.2? L'ho provato in gVim 7.1 (12 maggio 2007) e non funziona :(
fc.

No, ho aggiunto il comando: SubstituteCase al plugin nel 2007. Questo è tutto. Il plug-in è disponibile su vim.org e non viene fornito con vim come al solito con la maggior parte dei plug-in.
Luc Hermitte,

1. Questo non riesce quando l'utente ha :set ignorecase. 2. Badsarà sostituito da GOODinvece di Good. 3. La parte " job" della domanda viene ignorata, quindi sostituirà anche lambadalamgooda. Correzioni e spiegazioni per questi bug e alcune altre cose nella mia risposta . (Anche LOLOWLs!)
Aaron Thoma,

7

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.


4

Se abbini solo una stringa esatta (indipendente dal maiuscolo / minuscolo) con alcune possibili maiuscole, un'altra possibilità è:

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

2

Un'alternativa al plug-in keepcase è SmartCase, che sostituisce le parole mantenendo la custodia originale . (Non lasciarti scoraggiare dalle valutazioni negative.)


1
C'è un trucco per abbreviare quelli difficili da ricordare e noiosi da digitare comandi come :%s/file\A\?size/\=SmartCase("LastModifiedTime")/ig?
Michael Härtl,

@ MichaelHärtl: è possibile utilizzare il :SmartCasecomando. L'ho esteso con il mio fork . Si noti che ciò richiede ingo-library come dipendenza.
Ingo Karkat,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.