मैं विम में प्रत्येक ब्लॉक में पहली पंक्ति द्वारा पाठ के कई खंडों को कैसे सॉर्ट करता हूं?


11

मेरे पास पाठ के कई ब्लॉक हैं, या दूसरे शब्दों में, इस तरह के कई कार्य हैं:

def ==(other)
  ...
end

def to_s(full=false)
  ...
end

def to_a
  ...
end

def to_hash
  ...
end

def inspect
  ...
end

मैं फ़ंक्शन हस्ताक्षर द्वारा वर्णानुक्रम में सॉर्ट करना चाहता हूं। यह सबसे आसानी से विम में कैसे किया जा सकता है?


कृपया परिभाषित करें कि फ़ंक्शन हस्ताक्षर से आपका क्या मतलब है। ये किस प्रकार के कार्य हैं? इसके अलावा, आप OS, वितरण, और वर्जन नंबर के तहत किस प्लेटफॉर्म पर काम कर रहे हैं, यह बहुत मददगार होगा।
mdpc

1
VIM में ऐसा क्यों करना पड़ता है? वहाँ उत्कृष्ट निर्मित यूनिक्स / linux उपयोगिताओं है कि आसानी से इस तरह की चीजों के लिए एक साथ cobbled जा सकता है .... awk दिमाग में आता है।
mdpc

@mdpc: फंक्शन सिग्नेचर से मेरा मतलब है कि लाइन से युक्त def ...। मैं लिनक्स पर हूं, इसलिए उन उपयोगिताओं में से कोई भी मेरे लिए काम करेगा।
हब्रो

जवाबों:


11

यह अपेक्षाकृत सरल है (और, मुझे विश्वास है, जेसन के दिमाग में जो था) के करीब:

  1. अपने सभी फंक्शन्स को एक ही लाइनर में बदलकर सभी नए किरदारों को किसी न किसी फैंसी किरदार से बदल दें:

    :g/def/,/end/s/\n/§
    
  2. उन एक लाइनरों को क्रमबद्ध करें:

    :%sort
    
  3. अपने सभी कार्यों को उनकी प्रारंभिक व्यक्तिगत स्थिति में वापस विस्तारित करें:

    :g/def/s/§/\r
    

इसी तरह, यदि रिक्त रेखाओं को अद्वितीय विभाजक माना जा सकता है, तो यह किया जा सकता है :g/./,/^$/-s/\n/§/g, और फिर :%sort, और फिरs/§/\r/g
आर्टबिट

3

मैंने एक ही आदेश में @ romainl के उत्तर में दिए गए तीन अलग-अलग चरणों को सरल बनाने के लिए AdvancedSorters प्लगइन लिखा है :

:SortRangesByRange /^def\>/,/^end\>\_s*\zs$/

यहाँ पैटर्न थोड़ा और अधिक जटिल है, जिसमें अलग से खाली लाइनें शामिल हैं।


नोट: आपको वर्तमान में इसके लिए काफी नए Vim 7.4.218 की आवश्यकता होगी; मैं एक अपडेट प्रदान करूंगा जो पुराने Vim संस्करणों को भी जल्द ही सपोर्ट करेगा।
इंगो करकट

2

सबसे अच्छा तरीका है कि मैं एक फ़ंक्शन लिखने के बिना ऐसा करने के बारे में सोच सकता हूं जो परिभाषाओं को पार्स करता है, endएक और अद्वितीय सीमांकक (+ EOL +?)? और फिर :sort, और फिर रेखा-सीमांकक को फिर से स्थानापन्न करने के लिए रेखा के सीमांकक को स्थानापन्न करना होगा। यह शायद एक मैक्रो को दर्ज किया जा सकता है।

एक फ़ंक्शन बेहतर हो सकता है, हालांकि इस मामले में कि आप दृश्य चयन का उपयोग करना चाहते हैं।


2

विसर्ट प्लगइन का प्रयास करें। यह ब्लॉक सॉर्टिंग सुविधा का समर्थन करता है:

  • : '<'> बीएस नेक्स्ट एंडब्लॉक ढूंढाट टैगगट टैगब
  • : [रेंज] कॉल ब्लॉकसॉर्ट (अगली घड़ी, एंडब्लॉक, फाइंडटैग, टैगपैट, टैगब)

यदि कोई तर्क याद आ रहा है, तो BlockSort () आपको उनके लिए क्वेरी करेगा। नेक्स्टब्लॉक / एंडब्लॉक पैटर्न एक ब्लॉक का परिसीमन करता है, फाइंडटैग पैटर्न का उपयोग "टैग" वाली लाइन को खोजने के लिए किया जाता है जिसका उपयोग छँटाई के लिए किया जाएगा; टैग-टैग और टैब का उपयोग टैग-युक्त लाइन से सॉर्टिंग टैग को निकालने के लिए एक विकल्प में किया जाता है।

आप http://www.drchip.org/astronaut/vim/index.html#VISSORT से vissort.vim प्राप्त कर सकते हैं

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