स्वचालित रूप से विम में मिलान ब्रेसिज़ बनाएं


17

मैं स्वचालित रूप से विम में मिलान वाले ब्रेसिज़ कैसे बना सकता हूं?

यह निम्नानुसार काम करना चाहिए: यदि मैं एक खुले ब्रेस का इनपुट करता हूं, तो समापन अपने आप प्रकट होना चाहिए और कर्सर को बीच में रखा जाना चाहिए। ब्रेस जोड़ी से बाहर कूदने के लिए संयोजन Ctrl-jका उपयोग किया जाता है।

स्वचालित ब्रेस सम्मिलन प्रदान करने वाले बहुत सारे प्लगइन्स हैं। लेकिन वे

  • या तो Ctrl-jब्रेस जोड़ी से बाहर कूदने की तुलना में एक अलग कुंजी संयोजन का उपयोग करें या
  • UltiSnips कुंजी बाइंडिंग के साथ हस्तक्षेप करें ।

निम्नलिखित उम्मीद के मुताबिक काम करता है

:inoremap ( ()<Esc>:let leavechar=")"<CR>i
:imap <C-j> <Esc>:exec "normal f" . leavechar<CR>a

लेकिन इन सेटिंग्स के साथ UltiSnips स्निपेट्स किसी भी अधिक काम नहीं करते हैं। इसलिए मैंने समापन ब्रेस सम्मिलित करने के लिए यूलटिप्स का उपयोग किया:

inoremap ( (<C-R>=UltiSnips_Anon('($1)$0', '(')<CR>

यह लगभग काम करता है। मैचिंग ब्रेस डाला जाता है और मैं इसके साथ समापन को छोड़ सकता हूं Ctrl-j। यह, हालांकि, केवल तभी काम करता है जब खुली ब्रेस के सामने जगह होती है।

main () // works, the closing parentheses is added
main(   // fails without a space

मेरे समाधानों को या तो समापन ब्रेस पर कूदने के लिए एक अलग कुंजी बंधन की आवश्यकता होती है या खुले एक के सामने एक स्थान की आवश्यकता होती है। इसे कैसे ठीक करें?

नोट: मैंने एक उदाहरण के रूप में कोष्ठक का उपयोग किया। यह कोष्ठक, ब्रेसिज़, कोष्ठक और कम-से-कम संकेतों के साथ काम करना चाहिए और उलटीस्नीप्स प्लगइन के साथ हस्तक्षेप नहीं करना चाहिए।


1
क्या आपने आटोक्लोज़ की कोशिश की है ? आप उन जोड़ियों से बाहर निकल सकते हैं ), जिनकी पुनरावृत्ति c-jहो सकती है।
केविन

जवाबों:


4

मैं स्वचालित रूप से विम में मिलान वाले ब्रेसिज़ कैसे बना सकता हूं?

यह समस्या गैर-तुच्छ है, जैसा कि आप देखेंगे। एक प्लगइन का प्रयोग करें, जैसे: सरल जवाब है स्वतः या smartinput । बस भोली-भाली रीमेकिंग ([.. कीज़ आपको एक दो लाइन में edgecases के साथ प्रस्तुत करेगी, यही कारण है कि ये प्लगइन्स बने हैं, और क्यों वे आमतौर पर काफी जटिल हैं (यदि वे किसी भी अच्छे हैं)।

इसलिए मैंने समापन ब्रेस सम्मिलित करने के लिए उल्टीस्नीप का उपयोग किया

आप इसके बजाय यह कोशिश कर सकते हैं (जो मेरे मूल सुझाव से अलग है):

inoremap ( ()<CR>=UltiSnips_Anon('$1)$0', ')')<CR>

जहां UltiSnips मैच में (शामिल करने के बजाय लाइन को विभाजित करेगा main। इसके लिए स्निपेट प्लगइन का उपयोग करने में समस्या यह है कि वे (आमतौर पर) घोंसले के शिकार का समर्थन नहीं करते हैं, इसलिए वे अगले (नेस्टेड) ​​स्निपेट डालने पर किसी भी कूदने की स्थिति को भूल जाएंगे।

ब्रेस जोड़ी से बाहर कूदने के लिए संयोजन Ctrl-jका उपयोग किया जाता है।

आप Ctrl-jUltiSnips या परस्पर विरोधी प्लगइन के लिए रीमैप कर सकते हैं । यदि दस्तावेज़ में मैपिंग सूचीबद्ध नहीं हैं, तो आप :map/imap/nmap <key>मैपिंग दिखाने के लिए उपयोग कर सकते हैं । यदि आप Ctrl-jचुनना और चुनना और दोनों प्लगइन्स का काम करना चाहते हैं, तो आप इसके लिए पूछ रहे हैं:

  1. कुछ और अधिक उन्नत से मुझे संदेह है कि आप सोच सकते हैं
  2. मुझे कुछ संदेह है कि आप वास्तव में नहीं चाहते हैं

इस बैश लूप पर विचार करें:

while (( ${arr1[i]} < ${arr2[i<CURSOR>]} )); do
  [next_snippet_position_marker]
done

इस स्थिति में, आपको Ctrl-jलूप बॉडी में जाने के लिए 5 बार प्रेस करना होगा । एक संबंधित जोड़ी से बाहर निकलने के लिए समापन ब्रेसिज़ का उपयोग करना आपको बहुत अधिक नियंत्रण देता है जहां आप वास्तव में कर्सर को स्थानांतरित करना चाहते हैं। आप सम्मिलित जोड़े पर नज़र रखने और उपयोग करने के लिए एक स्टैक लागू कर सकते हैंCtrl-j पॉप और स्थानांतरित करने के लिए करने के हैं, लेकिन तब आप समस्याओं में भाग लेंगे यदि आप मैन्युअल रूप से स्टैक से हटाने के बिना ब्रेसिज़ को हटाना शुरू करते हैं। तो आप उन समस्याओं को हल करना शुरू कर देंगे जिन्हें ब्रेस-प्लगर्स हल करने की कोशिश कर रहे हैं। यह प्रबलित करने के लिए एक कठिन पहिया है।

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

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


1

मुझे लगता है कि सीमांकित करें वह करता है जो आपको चाहिए।

यह स्वचालित रूप से कोष्ठक या उद्धरण बंद कर देता है और आपके कर्सर को बीच में डालता है। कोष्ठक युग्म से बाहर कूदने के लिए (इन्सर्ट मोड में होने के दौरान) आप ऐसा करेंगे Ctrl-g+ gलेकिन आप इसे Ctrl-jअपने द्वारा जोड़कर रीमैप कर सकते हैं vimrc:

% Jump out of a block of parentheses (uses delimitMate)
imap <C-j> <C-g>g

यहां अधिक विवरण प्रदान करना बेहतर है, और आगे पढ़ने के लिए संदर्भ के रूप में लिंक का उपयोग करें। इस तरह से आपका उत्तर लिंक के अमान्य हो जाने पर उसके सभी मूल्य को ढीला नहीं करता है।
एंथन

1

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

मैं नेविगेशन और इंडेंटेशन में मदद करने के लिए निम्नलिखित मानचित्रों के साथ परिसीमन का उपयोग करता हूं , वही परिणाम प्राप्त करने की कोशिश कर रहा हूं :

imap <C-F> <C-G>g           " To jump out brackets in same line.
inoremap <C-K> <ESC>ki<TAB> " To move and insert an indent on the line before the current cursor (assuming empty line)

मैं इसे इस तरह से उपयोग करता हूं: ओपनिंग डालें { <CR><CR><C-K>और इंडेंट इनर लाइन में लिखना शुरू करें।


मैंने पाया कि सीमांकक एक हल्का सा अंतराल भी जोड़ रहा है
icc97

1

व्यक्तिगत रूप से मैं कोष्ठक और उद्धरणों के ऑटो सम्मिलन के लिए स्मार्टिनपुट का उपयोग करता हूं । उदाहरण के लिए {कहीं भी टाइप {}करना आपके कर्सर को मध्य में उत्पन्न करेगा । {ब्रैकेट समूह को छोड़ने के }लिए, आप सम्मिलित किए जाने के बगल में बस टाइप करें}

हालाँकि यह ब्रैकेट के बाहर टैबस्टॉप और कूदने की आपकी आवश्यकता का समर्थन करता है। यह आपके कोष्ठक के बीच एक नया सृजन नहीं करता है, लेकिन आपको इसके लिए बस एक अतिरिक्त कुंजी की आवश्यकता है -<CR>

आप <C-J>अगली पंक्ति में नीचे जाने के लिए मैप कर सकते हैं :

:inoremap <C-J> <C-O>j

या यदि आप अगली पंक्ति के प्रारंभ में जाना चाहते हैं:

:inoremap <C-J> <C-O>+

0

कुछ इस तरह से आप के लिए काम कर सकते हैं।

inoremap {      {}<Left>
inoremap {<CR>  {<CR>}<Esc>O
inoremap {{     {
inoremap {}     {}

आप जो सुझाव देते हैं वह एक साधारण मानचित्रण है जो समापन ब्रेस पर कूदने की अनुमति नहीं देता है।
मार्को

0

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

inoremap () ()<C-R>=UltiSnips#Anon('($1)$0', '()', 'double parentheses', 'i')<CR>

एक को टाइप करना होता है ()जो बेहतर लगता है लेकिन इसे भी बदला जा सकता है (। फिर, अतिरिक्त वैकल्पिक तर्क UltiSnips#Anonएक विवरण और संशोधक हैं iजो इन-शब्द विस्तार की अनुमति देता है।

<c-j>कार्यों के साथ कोष्ठक से बाहर कूदते हुए , अन्य स्निपेट के भीतर भी घोंसला बनाया। हालांकि, नेस्टेड ()कोष्ठकों को लागू करने से यह सुविधा टूटने लगती है, जो कोई बड़ी बात नहीं है।

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