मैं एक लाइनब्रेक कैसे सम्मिलित करूं जहां कर्सर विम में डालने मोड में प्रवेश किए बिना है?


88

क्या एक पंक्ति विराम सम्मिलित करना संभव है जहां कर्सर विस्मृति में प्रवेश किए बिना विम में है? यहाँ एक उदाहरण है ( [x]मतलब कर्सर चालू है x):

if (some_condition) {[ ]return; }

कभी-कभी, मैं कुछ और कोड दर्ज करना चाहूंगा। इसलिए मैं iइन्सर्ट मोड में आने के लिए प्रेस करूँगा , Enterलाइन ब्रेक डालने के लिए प्रेस करूँगा और फिर अतिरिक्त जगह को हटा दूँगा। अगला, मैं सामान्य मोड में प्रवेश करता हूं और समापन ब्रेस से पहले कर्सर को स्थिति देता हूं और फिर इसे अपनी लाइन पर लाने के लिए एक ही काम करता हूं।

मैं इसे थोड़ी देर कर रहा हूं, लेकिन निश्चित रूप से इसे करने का एक बेहतर तरीका है?


आप INSERT मोड में जाए बिना कुछ सम्मिलित करना चाहते हैं?
जेरेमी कैंटरेल

26
@ jeremy-cantrell हाँ, जैसे "J" अगली पंक्ति में शामिल होता है और INSERT मोड में जाए बिना एक व्हाट्सएप को सम्मिलित करता है!
रात

जवाबों:


107

आपके द्वारा दिए गए उदाहरण के लिए, आप rEnterEnter के साथ किसी एकल वर्ण (स्थान) को बदलने के लिए उपयोग कर सकते हैं । फिर, fspace.अगले स्थान पर आगे बढ़ने और अंतिम कमांड को दोहराने के लिए।

आपकी ऑटोइंडेंट सेटिंग्स के आधार पर, उपरोक्त कथन ठीक से इंडेंट नहीं कर सकता है या नहीं कर सकता है। यदि नहीं, तो sEnterTabEscजगह को एक नई रेखा के साथ बदलने के लिए उपयोग करें , लाइन को इंडेंट करें, और सम्मिलित करें मोड से बाहर निकलें। आपको दूसरे स्थान को एक अलग कमांड से बदलना होगा ताकि आप उपयोग न कर सकें। ' इस मामले में।


1
मुझे लगता है कि यह सबसे आसान उपाय है। धन्यवाद ग्रेग
मार्क ए। निकोलोसी

4
'f [स्पेस]' 'W' के बराबर होना चाहिए (यानी अगले व्हाइटपेस पर जाएँ)
नाथन

4
'डब्ल्यू' एक चरित्र को बहुत दूर ले जाता है, यह अगले व्हाट्सएप के बाद अगले चरित्र में चला जाता है ।
ग्रेग हेविगिल

1
तुम भी इस्तेमाल कर सकते हैं >>और <<मदद के खिसकने के लिए यदि आप के साथ डालने मोड में जाने नहीं करना चाहता था s
कोनर

12

यहां बताया गया है कि जब भी आप 'g' दबाते हैं, तो एक मैक्रो बनाने के लिए कर्सर पर एक नई रेखा डालें, जबकि सम्मिलित मोड में नहीं :

Vim के भीतर से, टाइप करें:

:map g i[Ctrl+V][Enter][Ctrl+V][Esc][Enter]

कहाँ पे:

  • [Ctrl + V] का अर्थ है कि Ctrl कुंजी दबाए रखें और 'v' दबाएं
  • [दर्ज करें] का अर्थ है Enter कुंजी दबाएं
  • [Esc] का अर्थ Esc कुंजी दबाएं

आप अपनी विम विंडो के नीचे निम्नलिखित देखेंगे जब तक आप फाइनल एंटर नहीं करते हैं:

:map g i^M^[

स्पष्टीकरण:

[Ctrl + V] का अर्थ है "निम्न वर्ण को उद्धृत करें" - यह आपको नई पंक्ति को एम्बेड करने और वर्णों से बचने की अनुमति देता है।

तो आप अनुक्रम के लिए 'जी' कुंजी मैप कर रहे हैं:

मैं [दर्ज करें] [बच]

यह कर्सर से पहले एक नई पंक्ति सम्मिलित करने के लिए विम है, फिर सम्मिलित मोड से बाहर निकलें

बदलाव:

  • आप किसी भी वर्ण के साथ 'g' को बदल सकते हैं जो पहले से आपके द्वारा उपयोग किए जाने वाले कमांड से लिंक नहीं है।
  • कमांड में और जोड़ें, उदाहरण के लिए f}i^M^[O - यह f } को इंड करेगा और मैं एक और न्यूलाइन लिखूंगा, फिर इंसर्ट मोड और पेन को खाली करने के लिए आपको अधिक कोड दर्ज करने से बचना होगा ।
  • इसे स्थायी करने के लिए आप अपने .vimrc या .exrc फ़ाइल में कमांड जोड़ सकते हैं। बस शुरू से ही कोलन को छोड़ दें, इसलिए कमांड "मैप" से शुरू होता है

का आनंद लें!


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

धन्यवाद। लेखक ने अनुरोध किया है कि क्या (मुझे लगता है) पूरा करने के लिए "Tweaks" अनुभाग अपडेट किया गया। जब मैंने इसका परीक्षण किया, तो vi स्वचालित रूप से मेरे लिए अतिरिक्त स्थान हटा दिया; यदि आपका नहीं है तो उन्हें हटाने के लिए 'x' का उपयोग करें। और vi कमांड मॉडेम लाइन शोर की तरह क्यों दिखते हैं? :-)
एडम लिस

11

Ctrl + Enter दबाकर कर्सर पर लाइन तोड़ने की एक सरल मैपिंग:

:nmap <c-cr> i<cr><Esc>

अनिवार्य रूप से 'इंसर्ट' मोड में प्रवेश करता है, एक लाइन ब्रेक सम्मिलित करता है और वापस सामान्य मोड में चला जाता है।

भविष्य के उपयोग के लिए इसे अपने .vimrc फ़ाइल में डालें।


5

यदि आप आमतौर पर एक लाइन ब्लॉक को तीन लाइनों तक बढ़ा रहे हैं, तो प्रतिस्थापन का प्रयास करें। खुलने वाले ब्रैकेट को ब्रैकेट / रिटर्न में बदलें, और क्लोजिंग ब्रैकेट को रिटर्न / ब्रैकेट में बदलें।

ब्रैकेट के लिए ब्रैकेट / वापसी को प्रतिस्थापित करने की कमान इस तरह दिखाई देती है:

:s/{/{\r/

चूंकि आप इसे अक्सर उपयोग करना चाहते हैं, आप पूर्ण अनुक्रम को इस तरह अप्रयुक्त कीस्ट्रोके में मैप कर सकते हैं:

:map <F7> :s/{/{\r/ ^M :s/}/\r}/ ^M

कहाँ आप देख ^ एम अनुक्रम में, प्रकार [Ctrl-V] , तो प्रेस दर्ज

अब अपने नमूना लाइन पर कहीं भी अपने कर्सर के साथ, मैप की गई कुंजी दबाएं, और गाड़ी के रिटर्न को जोड़ दिया जाता है।

:help map-which-keysमानचित्र पर अप्रयुक्त कीस्ट्रोक्स के चयन के बारे में सलाह के लिए जाँच करें।


BTW: gमैप नहीं किया जाता है क्योंकि यह दो कीस्ट्रोक्स (देखें :h g) से युक्त कई विम मैपिंग के लिए 'नामस्थान' कुंजी के रूप में उपयोग किया जाता है । तो यह मानचित्रण वास्तव में एक नहीं है।
होट्सके

क्या कोई अच्छी कमांड है जो रिपोर्ट gपहले से ही 'नेमस्पेस' कुंजी के रूप में उपयोग में है?
सुस्ती

विशेष रूप से नहीं। जैसा कि मैंने कहा कि :help gडिफ़ॉल्ट g+ कुछ मैपिंग की सूची देखने का एक तरीका है । z, [ ]आगे 'नाम स्थान' कुंजियाँ हैं, उदाहरण के लिए देखें :help index। आप :verbose map gसभी वर्तमान परिभाषित मैपिंग को जी के साथ शुरू करने के लिए देख सकते हैं। मददगार वेबसर्विस viemu.com/vi-vim-cheat-sheet.gif , vimcasts.org/blog/2014/02/follow-my-leader , vimeo.com/85343734 (स्लाइड्स: स्पीकरबोर्ड. com/ nelstrom / follow-my) हैं -हेल्डर )
होट्सचे

3

मान लें कि आप Kकिसी और चीज़ की मैपिंग के साथ ठीक हैं (अपनी पसंद की एक अलग कुंजी चुनें), और 'अस्थायी मार्कर के रूप में मार्कर का उपयोग करना ठीक है, ऐसा क्यों नहीं करते?

:nmap K m'a<CR><Esc>`'

अब चरित्र के ऊपर K को सामान्य मोड में दबाएं जिसके बाद आप चाहते हैं कि लाइन ब्रेक होने वाली लाइन को विभाजित करके कर्सर को छोड़ दें जहां यह था।


1

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

आप उन सेटिंग्स के किसी भी उपयोग नहीं करना चाहते हैं, का उपयोग sकरने के बजाय iकरने के क्रम में रों सिर्फ डालने से खाली करने के लिए अपने नए पाठ ubstitute बल्कि। (यदि कई रिक्त स्थान हैं, तो कर्सर को बाईं ओर रखें और cwइसके बजाय उपयोग करें ।)


1

मूल रूप से, जब आप एक पंक्ति को विभाजित करते हैं तो आप या तो केवल एक गाड़ी वापसी सम्मिलित करना चाहते हैं, या इस मामले में कि आप एक स्थान पर हैं, एक गाड़ी वापसी के साथ प्रतिस्थापित करें। अच्छा, एक या दूसरे के लिए समझौता क्यों? यहाँ K के लिए मेरी मैपिंग है:

"Have K split lines the way J joins lines
nnoremap <expr>K getline('.')[col('.')-1]==' ' ? "r<CR>" : "i<CR><Esc>"

मैं दो कार्यों को एक मुख्य मानचित्र में सम्मिलित करने के लिए टर्नरी ऑपरेटर का उपयोग करता हूं। इसे नीचे तोड़ने का <expr>मतलब है कि मुख्य नक्शे का आउटपुट गतिशील हो सकता है और इस स्थिति में उस स्थिति पर टिका getline('.')[col('.')-1]==' 'होता है जो विम के लिए पूछने के लिए लंबा घुमावदार तरीका है यदि कर्सर के नीचे का वर्ण एक स्थान है। अंत में, परिचित टर्नरी ऑपरेटर ? :या तो लाइनब्रेक के साथ स्थान को बदल देता है ( r<CR>) या एक नया सम्मिलित करता है ( i<CR><Esc>)

अब आपके पास Jकमांड के लिए एक प्यारी बहन का नक्शा है ।


यह बहुत चालाक है। मुझे यकीन नहीं है कि मैंने कभी जानबूझकर कश्मीर का उपयोग किया है, लेकिन इससे छुटकारा पाने या कहीं और हटाने के लायक हो सकता है।
ड्रैगन 788

0

इस कुंजी मैपिंग को अपने vimrc में सेट करें

:map <C-m> i<CR><Esc>h

इसके बाद अगर आप इसे अपने vim में इस्तेमाल करना चाहते हैं तो Ctrl + m दबाएं।


0

आईएमएचओ, बिल्ट-इन मैपिंग gsएक उपयोगी मैपिंग नहीं है (नींद के लिए विम लगाएं), कोई भी विभाजन के लिए इसका उपयोग कर सकता है:

nmap gs i<CR><ESC>

0

में Vrapper आप gql जो मोड डालने में प्रवेश के बिना एक पंक्ति विभाजित कर देगा का उपयोग कर सकते हैं, लेकिन हमेशा खरोज नहीं बनाए रख सकता है।


0

वास्तव में आपको निम्नलिखित संयुक्त कार्यों की आवश्यकता है:

  1. vविज़ुअल मोड दर्ज करने के लिए दबाएँ
  2. उस लाइन का चयन करें जिसे आप विभाजित करना चाहते हैं
  3. :कमांड मोड में प्रवेश करने के लिए दबाएँ
  4. s/\s/\r/g
  5. किया हुआ

0

यदि आपके पास इनपुट है:

aaa bbb ccc ddd

और उत्पादन करना चाहते हैं

aaa
bbb
ccc
ddd

आप कमांड का उपयोग कर सकते हैं

f r<ENTER>;.;.

0

मैंने पाया कि मैं इसके विपरीत व्यवहार की अपेक्षा सबसे अधिक ईमानदारी से कार्यान्वित करता हूं J

nnoremap S i<cr><esc>^mwgk:silent! s/\v +$//<cr>:noh<cr>`w

यह कर्सर पर सरलीकृत नई लाइन करता है, पिछली लाइन पर किसी भी ट्रेलिंग व्हाट्सएप की देखभाल करता है यदि कोई मौजूद है और फिर कर्सर को सही स्थिति में लौटाता है।

i <cr> <esc> - यह सुझाए गए सबसे आम समाधानों में से एक है, यह आपके कर्सर के तहत गैर-व्हाट्सएप पात्रों को नहीं हटाता है लेकिन यह आपको व्हाट्सएप के पीछे छोड़ देता है

^mw - नई लाइन की गोटो शुरू और के तहत एक निशान बनाएँ w

gk - एक लाइन ऊपर जाओ

:silent! s/\v +$//<cr> - रेगेक्स लाइन के अंत में किसी भी व्हाट्सएप को बदल देता है

:noh<cr> - कोई भी सर्च हाइलाइटिंग को क्लीयर करें कि रेगेक्स चालू हो सकता है

`w - के तहत निशान वापस w

अनिवार्य रूप से दोनों का सबसे अच्छा संयोजन करता है r<esc><cr>औरi<cr><esc>

नोट: मेरे पास यह बाध्य है Sजो संभावित रूप से एक उपयोगी कुंजी को अधिलेखित करता है, लेकिन यह एक पर्याय है ccऔर चूंकि मैं इसका उपयोग नहीं करता हूं क्योंकि मैं विभाजन करता हूं मैं इसे ओवरराइट करने के साथ ठीक हूं।



-1

यह मैपिंग आपके पास किसी भी एक-लाइन फ़ंक्शन को तोड़ देगा। बस अपने कर्सर को लाइन पर रखें और सामान्य मोड में 'g' को हिट करें:

:map g ^f{malr<CR>`a%hr<CR>`a

यह मानता है कि आपके पास उद्घाटन ब्रेस और समापन ब्रेस से पहले एक स्थान है। देखें कि क्या यह आपके लिए काम करता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.