เปลี่ยนคำตัวพิมพ์ใหญ่ทั้งหมดเป็นตัวพิมพ์เล็กได้อย่างไร แต่ไม่รวมตัวอักษรสตริงใน Vim

ฉันได้สคริปต์ sql ที่ค่อนข้างยาว โดยที่คีย์เวิร์ดทั้งหมดเป็นตัวพิมพ์ใหญ่ ฉันต้องการเปลี่ยนเป็นตัวพิมพ์เล็ก แต่คงค่าที่แน่นอนของตัวอักษรสตริงและตัวระบุของฉันเอง
ตัวอย่างเช่น ในข้อความนี้:

KEYWORD BEFORE 'SOME STRING LITERAL' KEYWORD AFTER
mixedCaseValue  
MY_OWN_VARAIBLE
UGLY APPERCASE KEYWORDS, other text

ฉันต้องการเพียง 'KEYWORD BEFORE', 'KEYWORD AFTER' และ 'UGLY UPPERCASE KEYWORDS' สุดท้ายให้เป็นตัวพิมพ์เล็กและส่วนอื่นๆ ทั้งหมดยังคงเหมือนเดิม
หากฉันใช้บางอย่างเช่นนี้ :%s/\<\u\+\>/\L&/g ข้อความภายในเครื่องหมายคำพูดในบรรทัดแรกก็จะได้รับผลกระทบเช่นกัน

คุณมีความคิดบ้างไหม?


person east825    schedule 17.03.2012    source แหล่งที่มา
comment
สิ่งนี้ช่วยได้ไหม ฉันไม่แน่ใจว่าคุณต้องการอะไรที่นี่ - vim.wikia.com/wiki/Switching_case_of_Characters   -  person Caffeinated    schedule 18.03.2012
comment
คุณช่วยอธิบายรายละเอียดเกี่ยวกับคำจำกัดความทางวากยสัมพันธ์ที่เข้มงวดยิ่งขึ้นของสตริงตัวอักษรในภาษาการเขียนโปรแกรมที่คุณใช้ได้ไหม ตัวอักษรสตริงที่ยกมาเดี่ยวเหล่านั้นสามารถครอบคลุมหลายบรรทัดได้หรือไม่ มีไวยากรณ์สำหรับการหลีกเลี่ยงเครื่องหมายคำพูดเดี่ยวภายในตัวอักษรสตริงหรือไม่?   -  person ib.    schedule 18.03.2012


คำตอบ (3)


สมมติว่าตัวอักษรสตริงไม่ครอบคลุมหลายบรรทัด และไม่มีไวยากรณ์สำหรับการหลีกเครื่องหมายคำพูดเดี่ยวภายในตัวอักษรสตริง ฉันจะใช้คำสั่งทดแทนต่อไปนี้

:%s/\%(^\%([^']*'[^']*'\)*\)\@<=[^']\+/\=substitute(submatch(0),'\<\u\+\>','\L&','g')/g
person ib.    schedule 18.03.2012
comment
เกือบจะได้ผลแล้ว หากคุณเรียกใช้ตามตัวอย่างของฉัน มันจะเปลี่ยน mixedCaseValue และ MY_OWN_VARAIBLE ด้วย แต่ตอนนี้ฉันรู้แล้วว่าควรจะไปในทิศทางไหน ขอบคุณ! - person east825; 18.03.2012
comment
@ east825: ฉันพลาดไปที่คุณต้องการตัวพิมพ์เล็กไม่ใช่ทุกอย่างที่อยู่นอกตัวอักษรสตริง แต่เป็นเพียงคำที่เป็นตัวพิมพ์ใหญ่ทั้งหมด คำสั่งที่ฉันเสนอสามารถเปลี่ยนแปลงได้ โปรดดูการอัปเดตของคำตอบ - person ib.; 18.03.2012
comment
ว้าว! มันใหญ่มาก! และดูเหมือนว่าจะทำงานได้ตรงตามที่ฉันต้องการ (อย่างน้อยก็เมื่อเห็นแวบแรก) ฉันคิดว่าคุณเป็นผู้ชนะ ตอนนี้ฉันต้องใช้เวลาในการค้นหา Vim เพื่อทำความเข้าใจว่ามันทำอะไร) - person east825; 19.03.2012

ทางเดียว:

:%v/'/s/\(^\|\s\)\@<=\u\+\(\s\|,\)\@=/\L&/g

คำอธิบาย:

%                      # Range: All file.
v/pattern/command      # Apply command to all lines that doesn't match pattern
'                      # The pattern, so apply substitution to lines that doesn't have it.
s/string/replacement/  # Replacement command.
\(^\|\s\)\@<=          # Zero-width preceding match: Beginning of line or a space.
\u\+                   # One or more alphabetic uppercase letters.
\(\s\|,\)\@=           # Zero-width positive match: Space or comma.
\L&                    # Lowercase the string matched
/g                     # Apply globally: Many times for each line.

ผลลัพธ์:

'SOME STRING LITERAL'  
mixedCaseValue  
MY_OWN_VARAIBLE
ugly appercase keywords, other text
person Birei    schedule 17.03.2012
comment
ทางออกที่ดี! ฉันไม่รู้เกี่ยวกับ '\@‹=' และ '\@=' มาก่อน ฉันคิดว่าฉันคิดว่ามันจะดีกว่านี้ถ้าไม่มี v/ ในตอนแรก ด้วยเหตุนี้ รูปแบบนี้จึงไม่จับคู่คีย์เวิร์ดตัวพิมพ์ใหญ่ในบรรทัดเดียวกันกับตัวอักษรสตริง (ฉันไม่ได้แสดงกรณีดังกล่าวเป็นตัวอย่าง) และอย่างน้อย $ อยู่ในวงเล็บปีกกาที่สองเพื่อจับคู่คำหลักที่ท้ายบรรทัด - person east825; 18.03.2012
comment
@east825: ใช่. คุณพูดถูก. เป็นวิธีแก้ปัญหาเฉพาะสำหรับตัวอย่างของคุณ แต่อาจล้มเหลวได้ในกรณีอื่นๆ อีกมากมาย กรอกตัวอย่างของคุณด้วยความเป็นไปได้อื่นๆ แล้วผู้ใช้จำนวนมากขึ้นจะให้แนวทางที่ดีกว่า - person Birei; 18.03.2012
comment
ขออภัย หากไม่มี v/ ก็จะจับคู่คำตัวพิมพ์ใหญ่ในเครื่องหมายคำพูดด้วย (เช่น 'STRING') - person east825; 18.03.2012

จิตวิญญาณที่รักภายในของฉันรู้สึกอึดอัดที่จะเขียนสิ่งเหล่านี้ แต่...

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

อีกทางหนึ่ง หากมีตัวอักษรสตริงเพียงไม่กี่ตัวที่ไม่จำเป็นต้องแตะ ให้เปลี่ยนสตริงเหล่านั้นเป็นสตริงอื่นเพื่อให้การทดแทนส่วนกลางไม่เปลี่ยนแปลง ทำการทดแทนส่วนกลาง แล้วเปลี่ยนกลับ แย่เช่นกันแต่มีประสิทธิภาพ

เอ่อ ฉันรู้สึกสกปรก

person David Pope    schedule 18.03.2012
comment
ที่จริงฉันทำไปแล้ว) ฉันแค่สงสัยว่าอาจมีคนรู้รูปแบบดีๆ ที่สามารถทำการทดแทนได้โดยอัตโนมัติ - person east825; 19.03.2012