ऑटो हाइलाइटिंग समान लाइनें पाठ


13

मैंने देखा कि एक कुशल विम निन्जा ने कुछ समय पहले ऐसा किया था, लेकिन मुझे नहीं है कि शुरू करने का कोई विचार था।

ए) क्या विम्स बैकग्राउंड कलर सेट करने का एक तरीका है ताकि समान सामग्री वाली लगातार लाइनें हाइलाइट हो जाएं।

बी) अगर कोई जानता है कि यह कैसे करना है कि यह एक अच्छा मोड़ होगा यदि हाइलाइटिंग लगातार लाइनों पर हुई, लेकिन केवल पहले शब्द (संपूर्ण रेखा नहीं) पर विचार करें।

हाइलाइटिंग को अलग-अलग रंगों में कॉन्फ़िगर किया जा सकता है, तो एक दूसरा ट्वीक मिलान रेखाओं की संख्या (या एबी के आधार पर शब्द सक्रिय है) के आधार पर उपयोग किया जाता है। तो हम केवल दो लगातार लाइनें हैं जो तब हरे रंग से मेल खाती हैं, 3-5 लगातार लाइनें फिर नारंगी, 6+ फिर लाल।


इसी तरह की पोस्ट:
रीगेक्स

जवाबों:


10

निम्नलिखित matchसेट (ए) के लिए काम करते हैं:

:syn match Low /\v(.+)\n(\1\n)/
:syn match Medium /\v(.+)\n(\1\n){2,4}/
:syn match Critical /\v(.+)\n(\1\n){5,}/
:hi Critical  ctermfg=red
:hi Medium  ctermfg=yellow
:hi Low  ctermfg=green

ऐसा लगता है कि यह आदेश महत्वपूर्ण है। यदि Lowया Mediumमैच के बाद आते हैं Critical, तो यह इन की शिथिल आवश्यकताओं के आधार पर, और इसी तरह से Lowwrt के लिए हो जाता है Medium

आपके द्वारा जोड़े जाने के तुरंत बाद हाइलाइटिंग प्रकट नहीं होती है, कहते हैं, एक 3 डी या 6 डी डुबकी लाइन, लेकिन एक बार जब आप उन्हें जोड़ने के बाद थोड़ा सा घूमते हैं। मुझे यकीन नहीं है कि यह क्या ट्रिगर करता है, बिल्कुल।

बी के लिए, मुझे लगता है कि आप रेगेक्स को बदल सकते हैं:

/\v(\S+).*\n(\1.*\n)/

सामान्य में, सभी को बदलने के (.*)साथ (\S+).*और \1साथ \1.*, या जो भी आप के लिए एक शब्द का गठन किया।


मैंने इसका उत्तर दिया क्योंकि मुझे इसकी आवश्यकता के अनुसार हाइलाइटिंग कैसे करनी है (जैसा कि प्रश्न द्वारा व्यक्त किया गया है)। @ मैट्स रेगुलर एक्सप्रेशन अच्छा है लेकिन मेरे द्वारा पूछे गए (हाइलाइटिंग बदलते हुए) पूछे गए वास्तविक सवाल का जवाब नहीं है।
मार्टिन यॉर्क

8

शुरुआती बिंदु के रूप में, यहां एक खोज पैटर्न है जो डुप्लिकेट लाइनों से मेल खाता है (प्रमुख व्हाट्सएप में परिवर्तन की अनदेखी):

              \zs                marks start of the pattern. Everything before here will not be highlighted
 ^                               start of the line
  \s*                            leading whitespace
       .\+                       match 1 or more non-newline characters
     \(   \)                     and use parens to capture this in match group 1

            \n                   match the newline character
                 \(        \)\+  1 or more
                      \1         copies of what was in the match group 1
                   \s*  \n       with leading whitespace followed by a newline
/^\s*\(.\+\)\n\zs\(\s*\1\n\)\+   the full regex

:help pattern इस तरह से रेगीज़ बनाने के बारे में अधिक जानकारी प्रदान करेगा

:help syntax आपको दिखाएगा कि इस नियमित अभिव्यक्ति को कैसे लें और इसे किसी ऐसी चीज़ में बदल दें जो आपके लिए हाइलाइट हो

वाक्यविन्यास स्क्रिप्ट लिखना सीखना कठिन हो सकता है, इसलिए एक अच्छा अल्पकालिक समाधान यह सुनिश्चित करने के लिए है कि यह 'मक्खी पर' किया 'incsearch'जाए ताकि यह सुनिश्चित हो सके कि खोजों को हाइलाइट किया गया है और उपरोक्त खोज को करने के लिए एक कुंजी मैपिंग की जाती है, अर्थातnnoremap <F5> /^\s*\(.\+\)\n\zs\(\s*\1\n\)\+<CR>


क्या रेगेक्स को वितरित करने का कुछ स्वचालित तरीका है? यह ऐसा स्पष्ट चित्रण प्रदान करता है।
मुरु

1
मैं इसे हाथ से कर रहा हूं। Vim में सबसे आसान तरीका यह है कि आप yy10pपूर्ण रीगेक्स के साथ लाइन पर कुछ ऐसा करें फिर उन हिस्सों का चयन करें जिन्हें आप हटाना चाहते हैं और हिट करना चाहते हैं r<space>। हो सकता है कि मैं चीजों को थोड़ा गति देने के लिए 'रिक्त स्थान के साथ इस लाइन पर चयन को छोड़कर सब कुछ को बदलने के लिए' एक कमांड जोड़ दूं।
मैट बोहेम

वाह! यह काफी कुछ प्रयास है!
मूरू

1
मैंने इसे थोड़ा तेज बनाने के लिए एक (वास्तव में बदसूरत) विम फ़ंक्शन बनाया: gist.github.com/mattboehm/da63a48eedf6f14375aa । एक लाइन का चयन करें, हिट करें ,rफिर <space>सामान्य / दृश्य मोड के साथ लाइनों को मिलाएं।
मैट बोहम
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.