กรณีรักษาแทนในกลุ่ม


154

สามารถนี้สามารถทำได้ในกลุ่ม?

สิ่งที่ฉันหมายถึงคือการค้นหา 'BadJob' และแทนที่ด้วย 'GoodJob' จะทำการแทนที่ต่อไปนี้

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

16
นี่ควรเป็นคุณสมบัติกลุ่ม มันสมเหตุสมผลมาก
Bach

คำตอบ:


120

ใช้abolish.vim :

:%S/badjob/goodjob/g

13
เราไม่สมควรได้รับ Tim Pope
Andrew Keeton

1
ปลั๊กอินนี้ดูเหมือนจะไม่ทำงานสำหรับฉัน ถ้าฉันเป็นคำเหมือนBadJobและฉันต้องการที่จะแทนที่ด้วยผมไม่สามารถใช้งานGoodJob %S/badjob/goodjob/gไม่สามารถตรวจจับคู่ได้
Roymunson

@Roymunson สิ่งที่คุณต้องทำคือ: %S/BadJob/GoodJob/gจากนั้นคำสั่ง Subvert จะเปลี่ยนเป็นโหมดผสมตัวพิมพ์และจะทำทุก substitions ตามที่ OP กำหนด
shivams

28

ฉันไม่รู้ว่านี่เป็นวิธีแก้ปัญหาที่คุณกำลังมองหาหรือไม่ แต่ฉันได้ใช้มันแล้ว: keepcase.vim

ไม่มีการสนับสนุนเป็นอย่างอื่นในกลุ่ม ...


11

แน่นอนคุณทำได้

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

PS ฉันเดา keepcase.vim สรุปตรรกะคล้าย ๆ กัน :)


ใช่มันไม่ตั้งแต่ปี 2007:% SubstituteCase / \ cbadjob / GoodJob / g ^^
ลัค Hermitte

ความหมายตั้งแต่ gVim 7.2? ฉันลองใน gVim 7.1 (12-May-2007) และมันไม่ทำงาน :(
fc.

ไม่ฉันได้เพิ่มคำสั่ง: SubstituteCase ลงในปลั๊กอินในปี 2007 นั่นคือทั้งหมด ปลั๊กอินนี้มีอยู่ใน vim.org และไม่ได้จัดส่งมาพร้อมกับ vim ตามปกติพร้อมกับปลั๊กอินส่วนใหญ่
ลัค Hermitte

1. :set ignorecaseล้มเหลวเมื่อผู้ใช้มี 2. Badจะถูกแทนที่โดยแทนGOOD Good3. " job" ส่วนหนึ่งของคำถามจะถูกละเว้นดังนั้นนี้ยังจะเข้ามาแทนที่→lambada lamgoodaการแก้ไขและคำอธิบายสำหรับข้อบกพร่องเหล่านี้และสิ่งอื่น ๆ ไม่กี่คนในของฉันคำตอบ (LOLOWLs!)
Aaron Thoma

7

คุณสามารถวางและปรับเปลี่ยนสิ่งนี้ได้
(แน่นอนถ้าคุณทำสิ่งนี้เป็นครั้งคราวคุณจะต้องการปลั๊กอินแทนความชั่วร้ายนี้ แต่สำหรับบางคนที่กำลังรีบและต้องการเพียงครั้งเดียวนี่คือแฮ็คที่รวดเร็ว เพื่อความสุขในการวางของคุณ :)

:%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 - คำตอบนี้สร้างจากคำตอบของพวกเขาแก้ไขข้อบกพร่องเล็กน้อย


4

หากคุณกำลังจับคู่สตริงที่แน่นอนเท่านั้น

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

2

ทางเลือกที่keepcaseปลั๊กอินSmartCase - เปลี่ยนคำพูดขณะที่การรักษากรณีเดิม (อย่าปล่อยให้ตัวเองถูกกีดกันจากเรทติ้งที่แย่)


1
มีเคล็ดลับในการย่อคำที่จำยากและน่าเบื่อให้สั้นลง:%s/file\A\?size/\=SmartCase("LastModifiedTime")/igหรือไม่?
Michael Härtl

@ MichaelHärtl: คุณสามารถใช้:SmartCaseคำสั่ง เราได้ขยายว่าในทางแยกของตัวเอง โปรดทราบว่านี้ต้องIngo ห้องสมุดเป็นพึ่งพา
Ingo Karkat
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.