Bisa ini dilakukan di Vim?
Yang saya maksud adalah: mencari 'BadJob' dan mengganti dengan 'GoodJob' akan melakukan penggantian berikut
'badjob' -> 'goodjob' 'BadJob' -> 'GoodJob' 'badJob' -> 'goodJob' 'BADJOB' -> 'GOODJOB'
Bisa ini dilakukan di Vim?
Yang saya maksud adalah: mencari 'BadJob' dan mengganti dengan 'GoodJob' akan melakukan penggantian berikut
'badjob' -> 'goodjob' 'BadJob' -> 'GoodJob' 'badJob' -> 'goodJob' 'BADJOB' -> 'GOODJOB'
Jawaban:
Gunakan abolish.vim :
:%S/badjob/goodjob/g
BadJob
dan ingin menggantinya GoodJob
, saya tidak dapat menggunakannya %S/badjob/goodjob/g
. Gagal mendeteksi kecocokan.
%S/BadJob/GoodJob/g
maka perintah Subvert akan beralih ke mode case campuran dan akan melakukan semua substitusi seperti yang diberikan oleh OP.
Saya tidak tahu apakah ini jenis solusi yang Anda cari ... tetapi saya telah menggunakan ini: keepcase.vim
Tidak ada dukungan di vim ...
tentu kamu bisa
:s/\cbad/\= strpart(submatch(0), 0 ,1) == toupper(strpart(submatch(0), 0, 1)) ? "GOOD" : "good"/
ps. Saya menebak keepcase.vim merangkum beberapa logika yang sama :)
:set ignorecase
. 2. Bad
akan diganti dengan GOOD
alih-alih Good
. 3. " job
" Bagian dari pertanyaan diabaikan, jadi ini juga akan menggantikan lambada
→ lamgooda
. Perbaikan dan penjelasan untuk bug ini dan beberapa hal lain dalam jawaban saya . (Juga LOLOWL!)
Anda dapat menempel dan mengadaptasi ini:
(Tentu saja, jika Anda melakukan ini dari waktu ke waktu, Anda akan menginginkan plugin alih-alih keburukan ini. Tetapi bagi beberapa yang terburu-buru dan hanya membutuhkannya sekali, ini adalah hack cepat untuk kesenangan menyisipkan Anda :)
:%s/\cbad\zejob/\= ( submatch(0)[0] is# toupper(submatch(0)[0]) ? 'G' : 'g' ) . ( submatch(0)[1] is# toupper(submatch(0)[1]) ? 'OOD' : 'ood' )
Terlepas dari pola pencarian, Anda harus mengedit empat '
string '
dalam kode pengganti: Edit bagian-bagian dengan huruf tebal :
:% s / \ c bad \ ze job / \ =
(submatch (0) [0] adalah # toupper (submatch (0) [0])? ' G ': ' g ').
(submatch (0) [1] adalah # toupper (submatch (0) [1])? ' OOD ': ' ood ')
Jangan gunakan versi 'oranye' ini untuk menempel, karena karakter linebreak-nya juga akan melanggar perintah.
/\ze
adalah vim regex sintaksis gula untuk menandai lookahead positif: Pola setelah \ze
diperiksa, tetapi tidak diganti.
is#
?? Biarkan saya jelaskan ... (Jika tertarik.)
#
(juga dalam ==#
dan lainnya ) memberlakukan sensitivitas kasus. Kalau tidak, dengan :set ignorecase
(yang saya gunakan, karena itu diperlukan untuk berguna :set smartcase
), vim akan mempertimbangkan 'a' == 'A'
!!
Gila apa adanya, kita harus memperhitungkannya: Karena ini tergantung pada pengaturan pengguna, ==
haruskah NEVAR digunakan! (Kecuali di mana itu akan menjadi yang Anda inginkan.) Saya bahkan akan mengikuti rekomendasi untuk digunakan ==#
ketika membandingkan bilangan bulat: http://learnvimscriptthehardway.stevelosh.com/chapters/22.html#code-defensive
is#
alih-alih ==#
adalah cara pengkodean lain secara defensif: Ini meningkatkan keamanan tipe: http://google.github.io/styleguide/vimscriptguide.xml?showone=Type_checking#Type_checking
Ini harus digunakan saat membandingkan dengan string literal.
'single-quoted'
alih-alih "double quoted"
string adalah praktik lain yang baik: http://google.github.io/styleguide/vimscriptguide.xml?showone=Strings#Strings
HT @fc. - jawaban ini dibangun berdasarkan jawaban mereka , memperbaiki beberapa kekurangan.
Alternatif untuk plugin keepcase adalah SmartCase - mengganti kata-kata sambil menyimpan case aslinya . (Jangan biarkan diri Anda patah semangat dengan peringkat buruk.)
:%s/file\A\?size/\=SmartCase("LastModifiedTime")/ig
?
:SmartCase
perintah. Saya telah memperpanjang itu di garpu saya sendiri . Perhatikan bahwa ini membutuhkan perpustakaan-ingo sebagai ketergantungan.