สามารถนี้สามารถทำได้ในกลุ่ม?
สิ่งที่ฉันหมายถึงคือการค้นหา 'BadJob' และแทนที่ด้วย 'GoodJob' จะทำการแทนที่ต่อไปนี้
'badjob' -> 'goodjob' 'BadJob' -> 'GoodJob' 'badJob' -> 'goodJob' 'BADJOB' -> 'GOODJOB'
สามารถนี้สามารถทำได้ในกลุ่ม?
สิ่งที่ฉันหมายถึงคือการค้นหา 'BadJob' และแทนที่ด้วย 'GoodJob' จะทำการแทนที่ต่อไปนี้
'badjob' -> 'goodjob' 'BadJob' -> 'GoodJob' 'badJob' -> 'goodJob' 'BADJOB' -> 'GOODJOB'
คำตอบ:
ใช้abolish.vim :
:%S/badjob/goodjob/g
BadJob
และฉันต้องการที่จะแทนที่ด้วยผมไม่สามารถใช้งานGoodJob
%S/badjob/goodjob/g
ไม่สามารถตรวจจับคู่ได้
%S/BadJob/GoodJob/g
จากนั้นคำสั่ง Subvert จะเปลี่ยนเป็นโหมดผสมตัวพิมพ์และจะทำทุก substitions ตามที่ OP กำหนด
ฉันไม่รู้ว่านี่เป็นวิธีแก้ปัญหาที่คุณกำลังมองหาหรือไม่ แต่ฉันได้ใช้มันแล้ว: keepcase.vim
ไม่มีการสนับสนุนเป็นอย่างอื่นในกลุ่ม ...
แน่นอนคุณทำได้
:s/\cbad/\= strpart(submatch(0), 0 ,1) == toupper(strpart(submatch(0), 0, 1)) ? "GOOD" : "good"/
PS ฉันเดา keepcase.vim สรุปตรรกะคล้าย ๆ กัน :)
:set ignorecase
ล้มเหลวเมื่อผู้ใช้มี 2. Bad
จะถูกแทนที่โดยแทนGOOD
Good
3. " job
" ส่วนหนึ่งของคำถามจะถูกละเว้นดังนั้นนี้ยังจะเข้ามาแทนที่→lambada
lamgooda
การแก้ไขและคำอธิบายสำหรับข้อบกพร่องเหล่านี้และสิ่งอื่น ๆ ไม่กี่คนในของฉันคำตอบ (LOLOWLs!)
คุณสามารถวางและปรับเปลี่ยนสิ่งนี้ได้
(แน่นอนถ้าคุณทำสิ่งนี้เป็นครั้งคราวคุณจะต้องการปลั๊กอินแทนความชั่วร้ายนี้ แต่สำหรับบางคนที่กำลังรีบและต้องการเพียงครั้งเดียวนี่คือแฮ็คที่รวดเร็ว เพื่อความสุขในการวางของคุณ :)
:%s/\cbad\zejob/\= ( submatch(0)[0] is# toupper(submatch(0)[0]) ? 'G' : 'g' ) . ( submatch(0)[1] is# toupper(submatch(0)[1]) ? 'OOD' : 'ood' )
นอกเหนือจากรูปแบบการค้นหาคุณต้องแก้ไขสี่'
สาย'
ในรหัสการแทนที่: แก้ไขส่วนที่เป็นตัวหนา :
:% s / \ c bad \ ze job / \ =
(submatch (0) [0] คือ # toupper (submatch (0) [0])? ' G ': ' g ')
(submatch (0) [1] คือ # toupper (submatch (0) [1])? ' OOD ': ' ood ')
อย่าใช้เวอร์ชัน 'สีส้ม' นี้เพื่อวางเนื่องจากอักขระที่มีการแบ่งบรรทัดจะทำให้คำสั่งหยุดทำงาน
/\ze
คือ vim regex น้ำตาล syntactic สำหรับการทำเครื่องหมาย lookahead เชิงบวก: รูปแบบหลังจากที่\ze
มีการตรวจสอบ แต่ไม่ได้ทดแทน
is#
?? ให้ฉันอธิบาย ... (ถ้าสนใจ)
#
(รวมถึงใน==#
และอื่น ๆ ) บังคับให้คำนึงถึงความอ่อนไหวของเคส มิฉะนั้นด้วย:set ignorecase
(ซึ่งฉันใช้เพราะเป็นสิ่งจำเป็นสำหรับสิ่งที่มีประโยชน์:set smartcase
), กลุ่มจะพิจารณา'a' == 'A'
!!
บ้าอย่างที่มันเป็นเราควรคำนึงถึงมันเพราะมันขึ้นอยู่กับการตั้งค่าของผู้ใช้==
ควรใช้ NEVAR! (ยกเว้นว่าจะเป็นสิ่งที่คุณต้องการจริง ๆ ) ฉันจะทำตามคำแนะนำเพื่อใช้==#
เมื่อเปรียบเทียบจำนวนเต็ม: http://learnvimscriptthehardway.stevelosh.com/chapters/22.html#code-defensively
is#
แทนที่จะ==#
เป็นวิธีการเข้ารหัสอีกวิธีหนึ่ง: ปรับปรุงความปลอดภัยของประเภท: http://google.github.io/styleguide/vimscriptguide.xml?showone=Type_checking#Type_checking
มันควรจะใช้เมื่อเปรียบเทียบกับตัวอักษรสตริง
'single-quoted'
แทนที่จะใช้"double quoted"
สายเป็นวิธีปฏิบัติที่ดีอีกอย่างหนึ่ง: http://google.github.io/styleguide/vimscriptguide.xml?showone=Strings#Strings
HT @fc - คำตอบนี้สร้างจากคำตอบของพวกเขาแก้ไขข้อบกพร่องเล็กน้อย
หากคุณกำลังจับคู่สตริงที่แน่นอนเท่านั้น
:s/abc/\={'abc':'xyz','Abc':'Xyz'}[submatch(0)]/i
ทางเลือกที่keepcaseปลั๊กอินSmartCase - เปลี่ยนคำพูดขณะที่การรักษากรณีเดิม (อย่าปล่อยให้ตัวเองถูกกีดกันจากเรทติ้งที่แย่)
:%s/file\A\?size/\=SmartCase("LastModifiedTime")/ig
หรือไม่?
:SmartCase
คำสั่ง เราได้ขยายว่าในทางแยกของตัวเอง โปรดทราบว่านี้ต้องIngo ห้องสมุดเป็นพึ่งพา