मैं VIM के कमांडलाइन पर "कर्सर के नीचे शब्द" कैसे निर्दिष्ट करूं?


86

मैं एक कमांड लिखना चाहता हूं जो वीआईएम में "कर्सर के तहत शब्द" निर्दिष्ट करता है। उदाहरण के लिए, मान लें कि मेरे पास एक शब्द पर कर्सर है और मैं इसे दो बार प्रदर्शित करता हूं। उदाहरण के लिए, यदि शब्द "abc" है और मुझे "abcabc" चाहिए तो मैं टाइप कर सकता हूं:

:s/\(abc\)/\1\1/

लेकिन फिर मैं कर्सर को "डीईएफ" पर ले जाने में सक्षम होना चाहता हूं और उसी कमांड का उपयोग करके इसे "डीएडीएफ" में बदल सकता हूं:

:s/\(def\)/\1\1/

मैं कमांडलाइन में कमांड कैसे लिख सकता हूं ताकि यह ऐसा करे?

:s/\(*whatever is under the commandline*\)/\1\1

जवाबों:


74

<cword>कर्सर के तहत शब्द है: (मदद <cword>)।

क्षमा करें, मुझे इस उत्तर में अधिक पूर्ण होना चाहिए था।

आप इसे करने के लिए एक कमांड nmap कर सकते हैं, या आलसी के लिए कीस्ट्रोक्स की यह श्रृंखला काम करेगी:

b #go to beginning of current word
yw #yank to register

फिर, जब आप अपने पैटर्न में टाइप कर रहे हैं तो आप हिट कर सकते हैं <control-r>0<enter>जो आपके कमांड में 0-वें रजिस्टर की सामग्री को चिपकाएगा।

आप इसके लिए एक कमांड भी बना सकते हैं:

:nmap <leader>w :s/\(<c-r>=expand("<cword>")<cr>\)/

जो आपकी कमांड लाइन को बदलने के लिए एक ही समय में '\' और 'w' को हिट करेगा

:s/\(<currentword>\)/

17
मैं महान जवाब की सराहना करते हैं, लेकिन मैं शायद सुझाव है कि yiwअधिक bywकेवल मांसपेशी स्मृति की वजह से। परिदृश्य जहां अपने कर्सर को पहले से ही शब्द में पहले वर्ण पर होने वाला है, तो आप चाहिए छोड़ देते हैं bऔर केवल टाइप ywबनाम आप कर सकते हैं छोड़ iमें yiw। दुर्घटनाएं हो सकती हैं, और एक गलती को ठीक करना निश्चित रूप से अधिक महत्वपूर्ण है :)
याकूब स्वार्टवुड

130

जबकि कमांड-लाइन मोड में, CTRL+ R CTRL+ Wकर्सर के नीचे शब्द सम्मिलित करेगा।

c_CTRL-Rअन्य सभी विशेष रजिस्टरों की सूची के लिए मदद देखें :

:help c_CTRL-R

28
yiwP

yiw: यान आंतरिक शब्द (कर्सर के नीचे का शब्द)। यह कमांड कर्सर को शब्द की शुरुआत में भी ले जाता है।

P: कर्सर से पहले चिपकाएँ।

आप तब उदाहरण के लिए मैप कर सकते हैं: < ALT > - Dइस कमांड पर:

:nmap < ALT >-D yiwP

4
सवाल विशेष रूप से विम के कमांडलाइन से "कर्सर के तहत शब्द" को निर्दिष्ट करने के बारे में था, कमांड मोड से नहीं
नाथन फ़ेलमैन

12

ऐसा करने का एक और आसान तरीका *कमांड का उपयोग करना है ।

नियमित मोड में, किसी शब्द के ऊपर, टाइप करें

*:s//\0\0<Enter>

* खोज पैटर्न को वर्तमान शब्द (उदाहरण के लिए \ <abc \>) बनाता है।

:s//वर्तमान खोज पैटर्न का उपयोग करके प्रतिस्थापन करता है, और \0प्रतिस्थापन अनुभाग में मिलान स्ट्रिंग है।

फिर आप इस व्यवहार को दोहरा सकते हैं, शब्द "डीफ़" पर कह सकते हैं, या तो उसी प्रकार से टाइप करके, या टाइप करके

*@:

@: बस <ex> की आवश्यकता के बिना अंतिम पूर्व कमांड को दोहराता है, इस मामले में प्रतिस्थापन।

आप qकमांड का उपयोग करके ऐसा करने के लिए एक त्वरित मैक्रो भी रिकॉर्ड कर सकते हैं

qd*:s//\0\0<Enter>q

फिर इसे टाइप करके अपने दिल की सामग्री तक दोहराएं

@d

जब आप एक शब्द पर डबल करना चाहते हैं। चूंकि यह पूर्व समाधान से केवल एक वर्ण कम है, इसलिए यह आपके लायक नहीं हो सकता है - जब तक आप शब्द-दोहरीकरण के बीच अन्य पूर्व-आदेश नहीं करेंगे, जो कि व्यवहार को बदल देगा@:


1

आपको मैपिंग के भीतर बैकस्लैश से बचने की आवश्यकता है। आप मैपिंग के भीतर प्रतिस्थापन स्ट्रिंग को भी शामिल कर सकते हैं।

:nmap <leader>w :s/\\(<c-r>=expand("<cword>")<cr>\\)/\\1\\1<cr>

1
ywPx

आप जो वर्णन करेंगे वही करेंगे।

ywPxw

कर्सर को अगले शब्द पर भी आगे बढ़ाएगा।


सवाल विशेष रूप से विम के कमांडलाइन से "कर्सर के तहत शब्द" को निर्दिष्ट करने के बारे में था, कमांड मोड से नहीं
नाथन फ़ेलमैन

कृपया कमांड में हर अक्षर, जैसे उत्तर का वर्णन करें।
विटाली ज़डनेविच

0

@ user11211 में कर्सर के नीचे शब्द की नकल करने का सबसे सरल तरीका है:

yiwP

यान आंतरिक शब्द (कर्सर को शब्द के प्रारंभ में ले जाता है), पेस्ट (कर्सर से पहले)।

जैसे। straigh [t] आगे ----> स्ट्रेटवर्वर [d] स्ट्रेटवर्ड

[] कर्सर है

समझाने के लिए...

आप शायद अपने डुप्लिकेट शब्द के बाद कर्सर रखना चाहते हैं:

yiwPea

straigh [t] आगे ----> सीधा सीधा []

ध्यान दें:

yiw

येन्क इनर वर्ड है (व्हॉट्सएप के बिना)

yaw

सभी शब्द हैं (व्हॉट्सएप को पीछे छोड़ते हुए)।

yawPea

इसलिए व्हॉट्सएप, और स्थिति कर्सर सहित डुप्लिकेट शब्द है।

straigh [t] आगे ----> सीधा सीधा []


यह सवाल विशेष रूप से विम के कमांडलाइन से "कर्सर के नीचे शब्द" निर्दिष्ट करने के बारे में था , कमांड मोड से नहीं।
नाथन फ़ेलमैन

1
आप कमांड मोड के भीतर सामान्य (कमांड मोड) कमांड में से किसी का भी उपयोग कर सकते हैं, बस उनके साथ पूर्ववर्ती करके: सामान्य ... उदाहरण के लिए: सामान्य वाईवाईपी सामान्य मोड में वाईवीपी के समान ही करेगा। यह निश्चित रूप से, जो आप पूछ रहे थे वह करने का धीमा तरीका है।
BBW से पहले Windows

-1
" count word  (case sensitive)
nmap <F4> :%s/\(<c-r>=expand("<cword>")<cr>\)//gn<cr>

क्या आप इस पर टिप्पणी कर सकते हैं?
नाथन फ़ेलमैन

1
यह वर्तमान बफ़र में कर्सर के नीचे शब्द कितनी बार दिखाई देता है, यह जानने के लिए nध्वज का उपयोग करता है :substitute। काफी चतुर, लेकिन वास्तव में इस सवाल का जवाब नहीं।
जैकब
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.