ฉันจะแปลงคำเป็น camelCase ในมาโครได้อย่างไร


14

ฉันมีรายการคำเช่นนี้

these are
some
words that I want
to convert to
camel case

ฉันต้องการวิธีที่จะเปลี่ยนตัวอย่างเช่นcamel caseเข้าไปcamelCaseในมาโคร (หรือวิธีที่จะเปลี่ยนทุกบรรทัดของการเลือกบรรทัดที่มองเห็นเป็นกรณีอูฐ)

ฉันสามารถใช้สิ่งที่ต้องการwgUlhxได้บ่อยเท่าที่จำเป็น แต่ปัญหาคือว่านี้ไม่ได้ทำงานให้กับคำพูดของความยาวที่แตกต่างกัน (ดังนั้นสำหรับตัวอย่างเช่นwgUlhxwgUlhxจะทำงานconvert this pleaseแต่ไม่ได้convert these pretty please)

ผลลัพธ์ที่ต้องการสำหรับบรรทัดข้างต้นจะเป็น

theseAre
some
wordsThatIWant
toConvertTo
camelCase

มีวิธีใดที่จะทำให้สิ่งนี้เป็นแบบอัตโนมัติหรือไม่?

คำตอบ:


16

อายไลน์เนอร์

ฉันพบการแทนที่นิพจน์ทั่วไปอย่างง่าย (สมมติว่ามีการตั้งค่า 'magic'):

:s/ \([a-zA-Z]\)/\u\1/g

ตรงกับตัวอักษรตัวเดียวใด ๆ หลังช่องว่างบันทึกจดหมาย จากนั้นจะแทนที่ด้วยตัวอักษรที่บันทึกไว้ซึ่งเป็นตัวพิมพ์ใหญ่ ( \u= ตัวพิมพ์ใหญ่\1= การจับคู่ที่บันทึกครั้งแรก) สำหรับการแข่งขันทุกครั้งในบรรทัด

ทาให้ทั่วไฟล์ทั้งหมดโดยการวาง%ระหว่างและ:s

ข้อเสียของโซลูชันนี้คือ linewise (ซึ่งใช้งานได้กับตัวอย่างของคุณ) แต่จะสั้นหากคุณต้องการให้อูฐพูดสักสองสามคำจากหลายคำภายในหนึ่งบรรทัด

ทางออกที่สมบูรณ์กว่า

map <leader>g~ :set opfunc=MyCamelCase<CR>g@
function! MyCamelCase(type, ...)
  let searchsave=@/
    silent s/\%>'\[ \([a-zA-Z]\)\%<']/\u\1/g
  let @/=searchsave
 endfunction

สิ่งนี้จะสร้างตัวดำเนินการใหม่ที่สามารถทำงานกับการเคลื่อนไหวได้ ถ้าคุณได้<leader>เป็น\, ได้รับแล้วข้อความดังต่อไปนี้ (กับ|เป็นเคอร์เซอร์):

This is some |example text to work with.

พิมพ์ดีด\g~3wให้

This is some exampleTextTo work with.

นั่นคือเราอูฐใส่ซองมากกว่า 3 คำ

คำอธิบายของการทดแทน:

s/เริ่มการทดแทน
\%>'\[มันเจ็บปวดเล็กน้อย \%>'mกล่าวว่าเพื่อให้ตรงไปทางขวาของเครื่องหมายที่ เราต้องการมาร์ค[แต่มันก็ต้องถูกหลบหนีในรูปแบบนี้ ดังนั้นสิ่งนี้จะเริ่มการแข่งขันหลังจากการเคลื่อนไหวที่ให้กับผู้ควบคุม
\([a-zA-Z\)เป็นเช่นเดียวกับจากซับด้านบน
\%<']นี่คืออีกปลายหนึ่งจับคู่ก่อนที่จะจบการเคลื่อนไหว
/\u\1/gคือการแทนที่จากหนึ่งซับด้านบน


ที่จริงแล้วมันไม่ได้เป็นมาโครมากนักเพราะมันเป็นสายการบินเดียว แต่คุณสามารถแมปมันเข้ากับคีย์ผสมได้
John O'M

เพิ่มรุ่นผู้ประกอบการที่จะทำ ทำงานได้ดีขึ้นเล็กน้อย
John O'M

ฉันคิดว่าไม่เป็นไรถ้าคำตอบของคุณไม่ได้ใช้มาโครเป็นพิเศษ ผู้ถามแสดงปัญหา XYในความคิดของฉัน
tommcdo

@tommcdo ใช่คุณพูดถูก ไม่จำเป็นต้องเป็นแมโครจริง มันแค่ต้องเป็นวิธีอัตโนมัติแบบหนึ่ง
Doorknob

12

สำหรับทางเลือกอื่นฉันใช้ปลั๊กอินvim-abolishที่มีคุณสมบัติการข่มขู่:

ต้องการที่จะกลายfooBarเป็นfoo_bar? กดcrs(บีบบังคับเพื่อ snake_case) MixedCase ( crm), camelCase ( crc), snake_case ( crs) และ UPPER_CASE ( cru) ล้วนอยู่ห่างออกไปเพียง 3 การกดแป้น คำสั่งเหล่านี้สนับสนุนrepeat.vim


2
+1 เนื่องจากมีปลั๊กอินของ Tim Pope ที่ฉันไม่เคยรู้มาก่อน
zool

5

คุณสามารถสร้างมาโครแบบเรียกซ้ำที่ทำสิ่งนี้ให้กับบรรทัดเดียวด้วยการกดแป้นต่อไปนี้:

qqqqqf xgUl@qq

(โปรดทราบว่าช่องว่างระหว่างfและกับxคือการแตะของ spacebar ไม่ใช่หยุดชั่วคราว)

ในรายละเอียด:

  1. ลบการลงทะเบียน q สิ่งนี้จำเป็นเพราะเรากำลังสร้างแมโครแบบเรียกซ้ำ (ดูขั้นตอนที่ 5):qqq

  2. เริ่มการบันทึกแมโครใน register q: qq

  3. คุณไม่สามารถใช้การwเคลื่อนไหวได้ที่นี่เนื่องจากคุณต้องการให้แมโครยกเลิกเมื่อมาถึงจุดสิ้นสุดของบรรทัดแทนที่จะกระโดดไปที่บรรทัดถัดไป ให้ข้ามไปที่อักขระช่องว่างถัดไปบนบรรทัดโดยกดปุ่มfตามด้วย spacebar:f<space>

  4. ลบช่องว่างและตัวพิมพ์ใหญ่ด้วยตัวอักษรต่อไปนี้: xgUl

  5. recurse เนื่องจากเราล้างการqลงทะเบียนในขั้นตอนที่ 1 ยังไม่มีสิ่งใดอยู่ในนั้นดังนั้นสิ่งนี้จะไม่ทำสิ่งใด:@q

  6. บันทึกแมโคร: q

จากนั้นคุณสามารถใช้แมโครนี้กับหลายบรรทัดโดยใช้ช่วง:

ใช้แมโครกับทุกบรรทัดในไฟล์:

:%normal @q

ใช้แมโครกับบรรทัด 2-5 ที่ครอบคลุม:

:2,5normal @q

:normal @qให้เลือกภาพและจากนั้นพิมพ์ สิ่งนี้จะเติมข้อมูลบรรทัดคำสั่งไว้ล่วงหน้าเมื่อคุณกด:ปุ่มส่งผลให้คำสั่งที่ใช้แมโครกับทุกบรรทัดในการเลือก:

:'<,'>normal @a

ไม่จำเป็นต้องล้างการqลงทะเบียนเช่นเดียวกับqqก่อนที่จะเริ่มการบันทึกการกดแป้น ในความเป็นจริงนั่นคือเหตุผลที่แม่นยำqqqงานเพื่อยกเลิกการqลงทะเบียน :)
tommcdo

แน่นอนว่าถ้าคุณกำลังทำอะไรบางอย่างที่จำเป็นต้องผนวกกับการqลงทะเบียน (เช่นการใช้qQ) การล้างมันก่อนอาจจะจำเป็น
tommcdo

2
@tommcdo ไม่เป็นความจริงในสำเนา Vim ของฉัน (กลุ่ม 7.3.87 เรียกใช้ด้วยvim -u NONE) เนื้อหาที่มีอยู่จะถูกล้างออกเมื่อคุณบันทึกการลงทะเบียนในขั้นตอนที่ 6 ดังนั้นการล้างการลงทะเบียนก่อนที่จะเริ่มจึงเป็นสิ่งจำเป็นหากคุณต้องการเรียกเก็บเงินคืน
รวย

@tommcdo ฉันได้อัปเดตคำตอบเพื่อให้ชัดเจนยิ่งขึ้นว่าทำไมขั้นตอนนี้จึงจำเป็น
รวย

ความผิดพลาดของฉันฉันกระโดดปืนไปที่นั่น การชี้แจงที่ยอดเยี่ยม!
tommcdo

1

ดูhttp://vim.wikia.com/wiki/Changing_case_with_regular_expressions มันอธิบายตัวปรับ \ U, \ L, \ u, \ l ค่อนข้างชัดเจนและชัดแจ้ง!

สาระสำคัญของมันคือต่อไปนี้:

มีบางครั้งที่คุณอาจต้องการดูไฟล์และเปลี่ยนตัวพิมพ์ที่ตรงกับเกณฑ์ที่กำหนด หากคุณเข้าใจการแสดงออกปกติดีคุณสามารถทำได้อย่างง่ายดาย

ง่ายเหมือนการวาง \ U หรือ \ L ไว้ด้านหน้า backreferences ที่คุณต้องการเปลี่ยนเคสและ \ E ที่ส่วนท้าย กลุ่มจะทำให้ข้อความใน backreference เป็นตัวพิมพ์ใหญ่หรือตัวพิมพ์เล็ก (ตามลำดับ) ใช้ \ u และ \ l (โดยไม่มี \ E ที่ส่วนท้าย) เพียงแค่เปลี่ยนตัวพิมพ์ของอักขระตัวแรกใน backreference

("backreference" เป็นส่วนหนึ่งของนิพจน์ทั่วไปที่อ้างถึงส่วนก่อนหน้าของนิพจน์ทั่วไป backreferences ที่พบบ่อยที่สุดคือ &, \ 1, \ 2, \ 3, ... , \ 9)

ตัวอย่างบางส่วนที่แสดงให้เห็นถึงพลังของเทคนิคนี้:

ตัวพิมพ์เล็กทั้งไฟล์

:% s /.*/ \ L & / g

(& เป็นการอ้างอิงย้อนหลังที่สะดวกซึ่งอ้างอิงถึงข้อความทั้งหมดของการแข่งขัน)

พิมพ์ใหญ่ทุกคำที่นำหน้าด้วย <(เช่นเปิดชื่อแท็ก HTML):

:%s/<\(\w*\)/<\U\1/g

หมายเหตุด้วยคำสั่ง gu และ gU

ตัวอย่างเช่น ggguG จะเป็นตัวพิมพ์เล็กทั้งหมด (gg = ไปที่ด้านบน gu = ตัวพิมพ์เล็ก G = ไปที่ EOF)

ด้วยการใช้ \ backgo ทั่วไป \ 0 แทนที่จะเป็นชื่อ (\ 1, \ 2 ฯลฯ ) คุณสามารถบันทึกการพิมพ์บางส่วนไว้บนแทนที่ stanza ของ regex

regex ส่วนบนนี้เป็นชุดของคำที่ชัดเจนที่จะพิมพ์ใหญ่ในไฟล์:

:%s/\(select\)\|\(order)\|\(by\)\|\(from\)\|\(where\)/\U\0/g

ไม่ใช่วิทยาศาสตร์จรวด แต่อย่างอื่นคุณต้องทำสิ่งนี้:

:%s/\(select\)\|\(order)\|\(by\)\|\(from\)\|\(where\)/\U\1\U\2\U\3\U\4\U\5/g

1
คุณช่วยสรุปบทความที่คุณพูดถึงในคำตอบได้ไหม?
ต้นไม้เขียวชอุ่มตลอดปี

แล้วพบกันใหม่? มันสำคัญมากหากคำตอบเดียวของลิงก์จะใช้ได้บางปีต่อมาไซต์นี้จะเต็มไปด้วยลิงก์ที่ถูกลบ แต่ถ้าคุณคัดลอกเฉพาะส่วนสำคัญของลิงค์ที่คุณอ้างอิงและให้ลิงค์ที่ OP สามารถรับข่าวสารเพิ่มเติมได้ก็ไม่เป็นไร
peterh - Reinstate Monica
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.