มีวิธีการแปลง VIM regex ให้เป็นโหมดเวทย์มนตร์ที่แตกต่างกันหรือไม่?


14

หากฉันมี Magic Vim regex ในสตริงตัวอักษรมีวิธีในการแปลง regex ทั้งหมดเป็นการนำเสนอทางเลือกที่ใช้โหมดมายากลที่แตกต่างกันดังนั้นฉันสามารถวาง regex ที่เทียบเท่าลงในซอร์สโค้ดได้หรือไม่

ตัวอย่างเช่นหากฉันต้องการแปลงรูปแบบโหมดเวทย์มนตร์นี้:

'\m-\=\<\d\+L\=\>\|0[xX][0-9a-fA-F]\+\>'

เป็นโหมดมายากลมากเพื่อให้อ่านง่ายขึ้นเช่น:

'\v-=<\d+L=>|0[xX][0-9a-fA-F]+>'

ฉันมักจะทำผิดพลาดพยายามแปลงด้วยมือ


ฉันไม่รู้จักเลย คุณวางแผนที่จะมีในสตริงที่ยกมาเดี่ยวเสมอหรือไม่?
FDinoff

บางทีนี่อาจเป็นจุดเริ่มต้น ฉันมี แต่มันเพิ่งทดสอบ
Christian Brabandt

เกี่ยวกับชื่อคำถามที่มันเป็นเรื่องยากคิดเกี่ยวกับการแปลง regex วิเศษมาก[0-9]+เป็นหนึ่งไม่มีมายากล ... ;-)
เคนท์

ดังนั้นฉันจึงพยายามสร้างปลั๊กอินสำหรับสิ่งนั้นมันทำงานได้ดี แต่มันก็ยังไม่สมบูรณ์แบบ นอกจากนี้สำหรับการอ้างอิงมีปลั๊กอินที่แปลง ruby ​​/ perl regex เป็น Vim regex, รหัสคือ ... huge: eregex
statox

1
@MuMind ฉันคิดว่าฉันไม่เข้าใจว่าการเปรียบเทียบแบบใดที่คุณกำลังมองหา :-) และเกี่ยวกับการปรับปรุงของปลั๊กอินอย่าลังเลที่จะทดสอบการใช้ github เพื่อส่งสัญญาณข้อผิดพลาดหรือแม้กระทั่งขอให้ดึงคำขอ ฉันยินดีที่จะดูมัน!
statox

คำตอบ:


3

คำสั่ง

:s\v\\(\W)/\1/

ควรพอเพียงที่จะแปลงรูปแบบส่วนใหญ่ให้เป็น\vโหมด มันจะไม่เปลี่ยน\mเครื่องหมายlil ' - และความรู้ของฉันเป็นไปไม่ได้ในการแทนที่เดียว มันสั้นพอที่จะพิมพ์ด้วยตนเองและจากนั้นคุณสามารถทำ:s/\\m/\\vเครื่องหมายโหมด

\Wเป็นชวเลข[^a-zA-Z0-9_]ซึ่งเป็นชุดของอักขระที่ถูกทำให้ยุ่งเหยิงซึ่งโหมดเวทมนต์ทำงาน เพียงแค่ลบแบ็กสแลชใด ๆ ข้างหน้าอักขระเหล่านั้นทันที ปัญหาที่ทราบ:นี้จะแทนที่สตริงภายใน\\ \คุณสามารถแทนที่\Wด้วย\c[^a-z0-9\_]เพื่อลดสิ่งนี้ แต่มันจะยังคงสับสนตัวอักษร regex ของคุณถ้าคุณเรียกใช้มันหลายครั้งและยังล้มเหลวในสตริงการหลบหนีอีกต่อไป (มี\\\\ตัวอย่าง)

อัปเดต:คำถามเดิมทำให้ไม่ชัดเจนหากคุณต้องการเปลี่ยน\vกลับเป็น\mแต่คำสั่งมี:

:s/\v(\\)@<!(\c[^a-z0-9\-\\\[\]\'_])/\\\2/
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.