Vim

2009-04-23 14 views
117

numaralı kutudaki muhafaza koruma ikamesi this Can Vim'de yapılabilir mi?Vim

Ne anlamına: 'BadJob' araması ve yapacağını 'Aferin' ile değiştirerek aşağıdaki değiştirmeler

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

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

cevap

74

Kullanım abolish.vim:

:%S/badjob/goodjob/g 
+3

Komutun tam adı: Subvert –

26

bu çözümün tür olup olmadığını bilmiyorum Aradığınız ... ama bu kullandım: ... keepcase.vim

aksi vim hiçbir destek yok

9

u can

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

ps emin olun. Ben sanırım keepcase.vim bazı benzer mantık kapsüller :)

+0

Evet, 2007'den beri çalışıyor::% SubstituteCase/\ cbadjob/GoodJob/g ^^ –

+0

gVim 7.2'den beri mi? GVim 7.1'de (12-Mayıs-2007) denedim ve işe yaramadı :( –

+0

Hayır, 2007'de eklentiye SubstituteCase komutunu ekledim. Hepsi bu. Eklentiyi vim.org adresinde bulabilirsiniz. ve en eklentileri ile her zamanki gibi vim ile gönderilmez. –

2

muhafaza eklentisine bir alternatif SmartCase - replacing words while keeping original case'dur. (Kendini kötü değerlendirmesi tarafından vazgeçirmek olmasına izin verme.)

+1

's:% s/file \ A \ gibi komutları yazmak için zor ve sıkıcı olanlar kısaltmak için bir hile var mı "size/\ = SmartCase (" LastModifiedTime ")/ig'? –

+0

@ MichaelHärtl:' 'SmartCase' komutunu kullanabilirsiniz. Bunu kendi çatalıma göre genişlettim (https://github.com/in karkat/SmartCase). Bunun bir bağımlılık olarak [kütüphane içi] (http://www.vim.org/scripts/script.php?script_id=4433) gerektirdiğini unutmayın. –

4

Sadece yapıştırın ve bu uyarlayabilirsiniz:
(Tabii ki, zaman bunu yaparsanız için zaman, bunun yerine bu canavarlığın bir eklenti isteyeceklerdir. Ama acele ve sadece bir kez ihtiyaç duyan bazıları için, bu yapıştırma zevk için hızlı kesmek :)

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

olduğunu

dışında arama deseni dışında, yedek kodunda dört ' dizeleri ' düzenlemek zorunda: kalın parçaları düzenleyin:

:% s/\ c kötü \ ze /\ =
(gönderim (0) [0] # toupper (eşleşmeli (0) [0]) nedir? 'G': 'g').

bu 'turuncu' kullanmayın:
(? 'ood' submatch (0) [1] # toupper (submatch (0) [1]) 'OOD' dir) linebreak karakterleri de komutları kıracaktır çünkü, yapıştırmanın sürümü.

/\ze bir pozitif ileri yönlü işaretleme vim normal ifade sözdizimsel şeker: \ze sonra desen için kontrol ama yer değiştirmiş değildir.


is# ?? Açıklamama izin verin… (İlgiliyse.

# (ayrıca ==# ve others) büyük/küçük harf duyarlılığı zorlar. Aksi halde, :set ignorecase ile (kullanıyorum, bu yararlı :set smartcase için gereklidir), vim 'a' == 'A' düşünecektir! Olduğu gibi

Çılgın, biz gerçekten bunun için hesap edilmelidir: o kullanıcı ayarları bağımlı olduğundan, == nevar kullanılmalıdır! http://learnvimscriptthehardway.stevelosh.com/chapters/22.html#code-defensively

is# yerine ==# savunmaya kodlama başka bir yoludur: tamsayılar karşılaştırırken (. Aslında ne istediğinizi nerede olacağını hariç) Hatta ==# kullanmak tavsiye takip edecek O tip geliştirir güvenliği: http://google.github.io/styleguide/vimscriptguide.xml?showone=Type_checking#Type_checking
Bir dize değişmeziyle karşılaştırılırken kullanılmalıdır. http://google.github.io/styleguide/vimscriptguide.xml?showone=Strings#Strings


HT @fc:

'single-quoted' yerine "double quoted"strings

başka iyi uygulama bulunmaktadır. - Bu cevap, bazı eksiklikleri gidermek için answer'a dayanıyor. Yalnızca birkaç olası aktifleştirilenler ile kesin (büyük-bağımsız) dize eşleşen ediyorsanız

0

, başka bir olasılık ise:

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