ไม่สนใจเครื่องหมายกำกับ / เสียงเมื่อค้นหา


12

มีวิธีในการสั่งให้ Vim ที่ฉันต้องการละเว้นการออกเสียง / การเน้นเสียงเมื่อค้นหาหรือไม่? ตัวอย่างเช่นฉันต้องการค้นหา

kočička

โดยการเข้าสู่

/kocicka

ignorecaseและsmartcaseตัวเลือกที่มีประโยชน์มาก แต่พวกเขาไม่ได้ดูเหมือนจะมีอะไรที่จะทำอย่างไรกับการกำกับ / สำเนียง


3
ที่เกี่ยวข้อง: และ:h [[= :h patterns-composing
muru

คำตอบ:


16

ตามที่ @muru พูดถึงในความคิดเห็นคุณสามารถใช้คลาสสมมูล (อธิบายไว้ใน:help /[[) ซึ่งดูเหมือนจะเป็นนิพจน์คลาสอักขระที่ประเมินว่าเป็นชุดของอักขระที่คล้ายกัน

ตัวอย่างเช่นหากต้องการค้นหาkočičkaและkocickaใช้รูปแบบเดียวกันคุณสามารถใช้สิ่งนี้:

ko[[=c=]]i[[=c=]]ka

โดยที่[[=c=]]เป็นคลาสเทียบเท่าสำหรับcตัวละคร


หากต้องการแทรกคลาสอักขระนี้โดยอัตโนมัติทุกครั้งที่คุณกดปุ่มcขณะทำการค้นหาคุณสามารถใช้การจับคู่นี้:

cnoremap <expr> c getcmdtype() =~ '[?/]' ? '[[=c=]]' : 'c'

ซึ่งสามารถพังทลายลงได้ดังนี้:

  • <expr> พิมพ์การประเมินผลของการแสดงออก
  • getcmdtype() =~ '[?/]' ทดสอบว่าคุณกำลังเขียนย้อนหลังหรือค้นหาไปข้างหน้า
  • '[[=c=]]'ส่งคืนคลาสสมมูลของcอักขระหากการทดสอบก่อนหน้านี้สำเร็จ
  • 'c'กลับcตัวละครเป็นอย่างอื่น

การแมปก่อนหน้ามี 2 ข้อบกพร่อง:

  1. ครอบคลุมcเฉพาะตัวละครเท่านั้น
  2. มันทำให้รูปแบบการอ่านยาก

มันสามารถปรับปรุงได้โดยทำการแมปใหม่<CR>เช่นนี้

cnoremap <CR> <C-\>e getcmdtype() =~ '[?/]' ? substitute(getcmdline(), '\a', '[[=\0=]]', 'g'): getcmdline()<CR><CR>

เมื่อคุณกด<CR>หลังจากเขียนรูปแบบสำหรับการค้นหาการจับคู่จะแทนที่อักขระที่เป็นตัวอักษรทั้งหมดโดยอัตโนมัติ


การทำแผนที่สำหรับ<CR>คล้ายกับการทำแผนที่ก่อนหน้านี้สำหรับcยกเว้นไม่ใช้อาร์กิวเมนต์แต่การทำแผนที่ระบบ<expr> อนุญาตให้คุณแทรกการประเมินผลของนิพจน์ในขณะที่อนุญาตให้คุณแทนที่บรรทัดคำสั่งทั้งหมดด้วยการประเมินผลของนิพจน์<C-\>e
<expr><C-\>e


1
นอกจากนี้ถ้าคุณอยากจะไปในทิศทางตรงกันข้ามเช่น/kočičkaไม้ขีดไฟkocickaแล้วคุณสามารถใช้แทน'[[:lower:][:upper:]]' '\a'ทางเลือก'[:alpha:]'และ'\I'ดูเหมือนจะไม่ทำงานกับอักขระหลายไบต์ อย่างไรก็ตาม'[^[:punct:]]'ดูเหมือนว่าจะใช้งานได้ (แม้ว่าฉันจะไม่ค่อยแน่ใจ) และฉันก็คาดเดาว่าจะสร้างชั้นเรียนที่เทียบเท่าของคุณเอง (เช่น'[А-яЁё]') ด้วยเช่นกัน
kevinlawler

ฉันหวังว่าจะมีการตั้งค่าสำหรับสิ่งนั้น ในขณะที่ใช้ [[= c =]] ทำงานได้ แต่ mistype หมายถึงคุณต้องคลิก backspace 7 ครั้ง เช่นเดียวกับการอ่านได้รับความเดือดร้อน
daliusd
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.