अगर मैंने 'के साथ खोज' शुरू की तो भी मुझे आगे बढ़ने के लिए 'एन' कैसे मिल सकता है? या '#'?


19

विम के पास कम से कम दो सेट हैं जो विपरीत दिशाओं में खोज करते हैं। टाइपिंग /और फिर एक पैटर्न पैटर्न के लिए दस्तावेज़ के माध्यम से आगे की खोज करेगा; टाइपिंग ?और फिर एक पैटर्न पिछड़े खोजेगा। एक ही संबंध मौजूद है *और #आज्ञाओं के बीच ।

मुझे यह पसंद नहीं है कि ये कमांड nऔर Nकमांड के लिए खोज दिशा भी सेट करें । उपयोग करने के बाद /, nदस्तावेज़ के माध्यम से आगे बढ़ता है और Nपीछे जाता है; उपयोग करने के बाद ?, nपिछड़ जाता है और Nआगे बढ़ जाता है। (दूसरे शब्दों में, nहमेशा मूल खोज के समान दिशा में Nजाता है और हमेशा दूसरी दिशा में जाता है।)

मैं nदस्तावेज़ के माध्यम से आगे कैसे बढ़ सकता हूं , और Nपिछड़े जाने के लिए, चाहे मैं किस दिशा में खोज शुरू करूं?

जवाबों:


29

आप के व्यवहार को बदल सकते हैं nऔर Nलगातार नीचे की ओर खोज करने के लिए / ऊपर की तरफ निम्नलिखित का उपयोग करके:

nnoremap <expr> n 'Nn'[v:searchforward]
nnoremap <expr> N 'nN'[v:searchforward]

अद्यतन: यह कैसे काम करता है?

यह अभिव्यक्ति-मानचित्रों का उपयोग करता है, जो मानचित्र के lhs को एक अभिव्यक्ति का मूल्यांकन करता है, जिसका मूल्यांकन किया जाता है, हर बार lhs का सामना किया जाता है। :h map-expressionमदद में देखें ।

क्या होता है, कि v: सर्चफोरवर्ड वेरिएबल (जो आंतरिक स्थिति को निर्धारित करता है कि अंतिम खोज किस दिशा में है, देखें :h v:searchforward) को इसके सामने स्ट्रिंग के लिए एक इंडेक्स के रूप में उपयोग किया जाता है। इसलिए पहले नक्शे के मामले में, यदि अंतिम खोज दिशा आगे थी, तो n को 'n' में मैप किया जाएगा (1 का इंडेक्स, जिसका अर्थ है दूसरा वर्ण लौटाएं) और यदि यह पीछे था, तो 'n' में मैप किया जाएगा 'एन' (क्योंकि v: सर्चफोरवर्ड वेरिएबल 0 है और इसलिए 'एन' वापस आ जाएगा।

उन मानचित्रों को लिखने का एक वैकल्पिक तरीका होगा (जो स्पष्ट हो सकता है):

nnoremap <expr> n (v:searchforward ? 'n' : 'N')
nnoremap <expr> N (v:searchforward ? 'N' : 'n')

कुछ प्लगइन्स भी हैं, जो ऐसा करते हैं (यानी SearchRepeat प्लगइन और संभवतः अन्य भी)।


मेरे प्लगइन का उल्लेख करने के लिए धन्यवाद; मैं बस सिफारिश करने वाला था कि एक विकल्प के रूप में :-)
इंगो करकट

2
सबस्क्रिप्टिंग का चतुर उपयोग!
22

6
क्या आप कृपया स्पष्टीकरण जोड़ सकते हैं? मैंने पहले इस सिंटैक्स को नहीं देखा है, और मैं जानना चाहूंगा कि यह कैसे काम करता है।
एवरग्रीनट्री

1
@EvergreenTree: कुछ और स्पष्टीकरण जोड़ा गया
क्रिश्चियन ब्रेबेंड

2
@ChristianBrabandt यह बहुत चालाक है। मैंने कभी भी v:searchforwardसूचकांक के रूप में उपयोग करने के बारे में नहीं सोचा था ।
एवरग्रीनट्री

1

क्रिश्चियन Brabandt के समाधान के आधार पर मैं साथ आया

nnoremap <expr> n 'Nn'[v:searchforward].(&fdo=~'search\\|all'?'zv':'')
nnoremap <expr> N 'nN'[v:searchforward].(&fdo=~'search\\|all'?'zv':'')

ये मैपिंग foldopenसेटिंग को भी मानते हैं


0

मैं SearchIndex प्लगइन का उपयोग कर रहा हूं । क्रिश्चियन ब्रेबेंड के उत्तर का उपयोग करने के लिए, लेकिन हर बार जब मैं टाइप करता हूं nया फिर मैच संख्या प्रदर्शित करने का प्लगइन की कार्यक्षमता रखता हूं N, तो मैंने इसे अपने vimrc में रखा:

nnoremap <silent><expr> n (v:searchforward ? 'n' : 'N') . ":SearchIndex<CR>"
nnoremap <silent><expr> N (v:searchforward ? 'N' : 'n') . ":SearchIndex<CR>"
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.