Vim में करंट लाइन से मेल खाने वाली लाइनों की खोज कैसे करें


11

मैं आमतौर पर शब्दों के लिए खोज करता हूं :/string, लेकिन अगर मुझे पूरी वर्तमान रेखा को खोजना है, तो यह कैसे करना है।

event: 1  beacon: 0x02              //line 1
event: 19 beacon: 0x02              //line 2
event: 1  beacon: 0x03              //line 3
event: 1  beacon: 0x02              //line 4
event: 8  beacon: 0x01              //line 5
event: 19 beacon: 0x02              //line 6
event: 1  beacon: 0x02              //line 7

उदाहरण के लिए, यदि cursorवर्तमान में संपूर्ण वर्तमान पंक्ति वाले पाठ के line 1समान खोज करने के :/लिए वर्तमान में है। कर्सर को फिर से मिलान line 4, और फिर से कूदना चाहिएline 7

जवाबों:


7

यहाँ है कि मैं यह कैसे करूँगा:

  1. लाइन को अनामांकित में (बिना नाम के रजिस्टर में), अंत में न्यूलाइन को शामिल किए बिना: 0y$
  2. बहुत ही दुखद खोज आरंभ करें:/\V
  3. Yanked लाइन जोड़ें: <c-r>"
  4. खोज बंद करें: <cr>

जैसा कि @EvergreenTree एक टिप्पणी में बताता है , आप निश्चित रूप से एक बार में सभी चरणों को पूरा करने के लिए एक मानचित्रण बना सकते हैं:

nnoremap <leader>* 0y$/\V<c-r>"<cr>

प्रासंगिक सहायता विषय:

:help registers
:help /magic
:help c_CTRL-R

नायब यदि आप जिस रेखा को खोज रहे हैं, उसमें बैकस्लैश शामिल हैं, तब भी आपको बहुत ही नाममात्र की खोज के साथ उन्हें (एक और बैकस्लैश जोड़कर) बचकर निकल जाना होगा ।


4
बेशक, आप इसके लिए एक मानचित्रण भी बना सकते हैं: nnoremap {key} 0y$/\V<c-r>"<cr>
एवरग्रीनट्री

9

विशेष रूप से मानचित्रण प्रयोजनों के लिए, मैं getline()खुद को यैंकिंग करने की तुलना में अधिक सुरुचिपूर्ण का उपयोग कर पाता हूं । getline()स्ट्रिंग के साथ कॉलिंग '.'कर्सर के नीचे की लाइन को लौटाता है। इसका उपयोग करने के लिए दो अच्छे विकल्प हैं:

:exec '/' . getline('.')

जो तार को पार करता है '/'और जो एक साथ वापस आता है getline()और उसको vim कमांड के रूप में निष्पादित करता है।

या

/<C-r>=getline('.')<CR>

जो अभिव्यक्ति रजिस्टर का उपयोग करता है @=। निम्नलिखित अभिव्यक्ति =का मूल्यांकन पहले के बाद किया <CR>जाता है और कमांड लाइन में रखा जाता है।


अच्छा! जब रेखा में वर्ण जैसा होता है /या 'यह बहुत अच्छी तरह से काम नहीं करता है। वैसे भी, मैं आज कुछ सीखता हूं! धन्यवाद
एम

4

व्यक्तिगत रूप से मुझे एक विज़ुअल स्टार प्लगइन मिलेगा ( वहाँ कुछ बाहर हैं )। इस बारे में एक अच्छा विमकास्ट है: चयनित पाठ के लिए खोजें । इसका मतलब है कि आप नेत्रहीन रेखा का चयन कर सकते हैं और फिर दबा सकते हैं *

यदि कोई प्लगइन आपकी चीज़ नहीं है, तो आप निम्न मैपिंग को अपने साथ जोड़ सकते हैं vimrc:

xnoremap * :<c-u>let @/=@"<cr>gvy:let [@/,@"]=[@",@/]<cr>/\V<c-r>=substitute(escape(@/,'/\'),'\n','\\n','g')<cr><cr>

नोट: विज़ुअल-ब्लॉक ( <c-v>) इस मैपिंग के लिए समर्थित नहीं है।


मैंने मैपिंग को जोड़ा है लेकिन वास्तव में यह पहले मिलान शब्द के लिए कूद रहा है और पूरी लाइन का चयन नहीं कर रहा है।
मानव एम.एन.

यदि यह एक शब्द से मेल खाता है तो मुझे लगता है कि आप *सामान्य मोड से उपयोग कर रहे हैं या सही तरीके से मैपिंग स्थापित नहीं है।
पीटर रिंकेर

4

मौजूदा उत्तर सभी विफल हो जाते हैं यदि आपकी पंक्ति में कुछ आइटम हैं जो एक पैटर्न के हिस्से के रूप में व्याख्या किए गए हैं। \Vमतलब नहीं जिस तरह से ज्यादातर हो जाता है, लेकिन अभी भी बैकस्लैश के साथ को खराब करता।

Backslashes से बचने के लिए यह प्रयास करें ...

/\V<C-R>=escape(getline('.'), '\')

और फिर यदि आप इसे एक मैपिंग में उपयोग कर रहे हैं, तो आपको <Enter>अंत में एक या दो एस की आवश्यकता होगी जो इस बात पर निर्भर करता है कि आप इसे कैसे काम करना चाहते हैं।


बहुत बढ़िया जवाब! लाइनों में अक्सर दोनों प्रकार के स्लैश होते हैं जो अन्य उत्तरों को भ्रमित करते हैं। भागने के अंतिम तर्क में आगे स्लैश भी शामिल होना चाहिए:escape(…, '/\')
bobbogo

2

साथ vim-तारा चिह्न बस का उपयोग स्थापित V$*(या 0v$*) इसके लिए खोज वर्तमान पंक्ति का चयन करने और।

0यदि कर्सर पहले से ही लाइन की शुरुआत में है, तो दूसरी कमांड आवश्यक नहीं है।


1
*केवल कर्सर के नीचे शब्द की खोज नहीं करता है, और वर्तमान दृश्य चयन नहीं है?
एवरग्रीनट्री

1
@EvergreenTree मैं प्लगइन का उल्लेख करना भूल गया। सूचना के लिए धन्यवाद
adelarsq

2

ऐसा करने का एक और तरीका कमांड-लाइन विंडो का उपयोग कर रहा है: yy/<Ctrl-F>p<Enter>

  • आप के साथ की जरूरत पूरी लाइन Yank yy
  • /कमांड लाइन विंडो खोलने के लिए प्रेस और फिर Ctrl-F
  • pलाइन पेस्ट करने के लिए दबाएँ
  • खोज शुरू करने के लिए Enter दबाएँ

5
आप इसका उपयोग q/उसी प्रभाव के लिए भी कर सकते हैं जैसे/<c-f>
evilsoup

2

http://vim.wikia.com/wiki/Searching_for_expressions_which_include_slashes बताते हैं कि खोज रजिस्टर को इस तरह सीधे सेट किया जा सकता है:

:let @/='/abc/def/ghi/'

यह लाइन पर खोज की अनुमति देता है और तब भी काम करता है जब लाइन में स्लैश शामिल होते हैं।

तो बनाने के लिए, कहते हैं, \*एक लाइन खोज करने के लिए नक्शा:

nnoremap <leader>* :set hlsearch<cr>:let @/=getline('.')<cr>
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.