Vim'de vaka muhafaza ikamesi


154

Can bu Vim yapılabilir?

Ne demek istiyorum: 'BadJob' aramak ve 'GoodJob' ile değiştirmek aşağıdaki yedekleri yapar

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

16
Bu bir vim özelliği olmalıdır. Çok mantıklı geliyor.
Bach

Yanıtlar:


120

Abolish.vim kullanın :

:%S/badjob/goodjob/g

13
Tim Pope'yi hak etmiyoruz.
Andrew Keeton

1
Bu eklenti benim için çalışmıyor gibi görünüyor. Eğer benim gibi bir kelimem BadJobve onun yerine koymak GoodJobistersem, kullanamam %S/badjob/goodjob/g. Bir eşleşme algılanamıyor.
Roymunson

@Roymunson Yapmanız gereken şudur: %S/BadJob/GoodJob/gSubvert komutu karışık durum moduna geçecek ve OP tarafından verilen tüm alt bölümleri gerçekleştirecektir.
shivams

28

Bu aradığınız bir çözüm olup olmadığını bilmiyorum ... ama bunu kullandım: keepcase.vim

Vim'de başka türlü destek yok ...


11

elbette yapabilirsin

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

ps. tahmin ediyorum keepcase.vim bazı benzer mantık kapsüller :)


Evet 2007'den bu yana::% SubstituteCase / \ cbadjob / GoodJob / g ^^
Luc

GVim 7.2'den beri anlamı nedir? Ben gVim 7.1 (12-Mayıs-2007) denedim ve işe yaramaz :(
fc.

Hayır, 2007'de eklentiye: SubstituteCase komutunu ekledim. Hepsi bu. Eklenti vim.org'da mevcuttur ve çoğu eklenti ile her zamanki gibi vim ile gönderilmez.
Luc Hermitte

1. Kullanıcı sahip olduğunda bu başarısız olur :set ignorecase. 2. Badile ikame edilecektir GOODyerine Good. 3. jobSorunun " " kısmı yok sayılır, bu nedenle bunun yerine de lambada→ geçecektir lamgooda. Düzeltmeler ve benim de bu böcek ve birkaç başka şeyler için açıklamalar cevap . (Ayrıca LOLOWLs!)
Aaron Thoma

7

Bunu yapıştırabilir ve uyarlayabilirsiniz:
(Tabii ki, bunu zaman zaman yaparsanız, bu canavarlık yerine bir eklenti isteyeceksiniz.Ama acelesi olan ve sadece bir kez ihtiyaç duyanlar için bu hızlı bir hack'tir. yapıştırma zevkiniz için :)

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

Arama modelinden ayrı olarak, değiştirme kodundaki dört 'dizeyi düzenlemeniz gerekir ': Parçaları kalın harflerle düzenleyin :

:% s / \ c bad \ ze job / \ =
(submatch (0) [0] # daha büyük (submatch (0) [0])? ' G ': ' g ').
(submatch (0) [1] # daha büyüktür (submatch (0) [1])? ' OOD ': ' ood ')

Yapıştırma için bu 'turuncu' sürümü kullanmayın, çünkü linebreak karakterleri de komutu kıracaktır.

/\zepozitif bir ileriye doğru işaretlemek için vim regex sözdizimsel şekerdir: Sonraki model \zekontrol edilir, ancak ikame edilmez.


is#?? Açıklayayım… (İlgileniyorsa.)

#(ayrıca ==#ve diğerlerinde ) büyük / küçük harfe duyarlılığı uygular. Aksi takdirde, :set ignorecase(kullanacağım, çünkü bu yararlı için gereklidir :set smartcase), vim dikkate alacaktır 'a' == 'A'!

Çılgın olduğu gibi, bunu gerçekten hesaba ==katmalıyız : Kullanıcı ayarlarına bağlı olduğu için NEVAR kullanılmalıdır! (Bunun tam olarak nerede olmasını istediğiniz hariç.) ==#Tamsayıları karşılaştırırken kullanma önerisini bile takip edeceğim : http://learnvimscriptthehardway.stevelosh.com/chapters/22.html#code-defensively

is#yerine ==#savunmacı bir şekilde kodlamanın başka bir yoludur: Tür güvenliğini artırır: http://google.github.io/styleguide/vimscriptguide.xml?showone=Type_checking#Type_checking
Bir dizgi değişmeziyle karşılaştırılırken kullanılmalıdır.

'single-quoted'"double quoted" dizeler yerine başka bir iyi uygulama: http://google.github.io/styleguide/vimscriptguide.xml?showone=Strings#Strings


HT @ fc. - Bu cevap, birkaç eksiklik gidererek onların cevabı üzerine kuruludur .


4

Yalnızca kesin (büyük / küçük harf bağımsız) bir dizeyi birkaç büyük / küçük harfle eşleştiriyorsanız, başka bir olasılık:

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

2

Keepcase eklentisine bir alternatif , SmartCase'dir - orijinal durumu korurken sözcükleri değiştirmek . (Kötü reytinglerden vazgeçmenize izin vermeyin.)


1
Gibi komutları hatırlamak zor ve sıkıcı olanlar kısaltmak için bir hile var mı :%s/file\A\?size/\=SmartCase("LastModifiedTime")/ig?
Michael Härtl

@ MichaelHärtl: :SmartCaseKomutu kullanabilirsiniz . Bunu kendi çatalımda uzattım . Bunun bir bağımlılık olarak ingo kütüphanesi gerektirdiğini unutmayın .
Ingo Karkat
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.