खोज करते समय डायक्टिक्स / उच्चारण की उपेक्षा करना


12

क्या विम को निर्देश देने का एक तरीका है कि मैं खोज करते समय डायक्टिक्स / लहजे को अनदेखा करना चाहता हूं? उदाहरण के लिए, मैं खोजना चाहूंगा

kočička

प्रवेश करके

/kocicka

ignorecaseऔर smartcaseविकल्प बहुत उपयोगी होते हैं, लेकिन वे विशेषक / लहजे के साथ कोई लेना देना नहीं हैं।


3
संबंधित: :h [[=और :h patterns-composing
मूरू

जवाबों:


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:]]'काम करने लगता है (हालांकि मुझे यकीन है कि कम है), और मुझे लगता है कि आप अपने खुद के समतुल्य वर्ग (जैसे, '[А-яЁё]') का निर्माण करेंगे।
केविनलावलर

काश उसके लिए कोई सेटिंग होती। उपयोग करते समय [[= c =]] काम करता है लेकिन गलती का मतलब है कि आपको 7 बार बैकस्पेस क्लिक करना होगा। साथ ही पठनीयता ग्रस्त है।
daliusd
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.