एटम या उदात्त पाठ के समान एक ही पंक्ति में विम सिलवटों को संक्षिप्त करें


13

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

नीचे दिए गए स्क्रीनशॉट को देखें विम की इंडेंट फोल्डिंग (टॉप) बनाम एटम की (नीचे):विम बनाम एटम कोड फोल्डिंग

विम प्रत्येक गुना के लिए दो लाइनें समर्पित करता है। पहली पंक्ति एक शीर्षक के रूप में कार्य करती है, और दूसरी पंक्ति तह के बारे में कुछ जानकारी (पंक्तियों की संख्या और तह के अंदर पाठ) का वर्णन करती है।

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

मैं एटम फोल्डिंग स्टाइल में आंशिक हूं। यह मेरी राय में, क्लीनर और अधिक सुसंगत लगता है, खासकर जब एक पंक्ति में कई तरीकों या विशेषताओं को सूचीबद्ध किया जाता है (जैसा कि उपरोक्त स्क्रीनशॉट में है)।

क्या विम में मोटे तौर पर अनुमानित फोल्डिंग स्टाइल का एक तरीका है?


1
मुझे लगता है कि ऐसा इसलिए है क्योंकि आपके फोल्ड्स वास्तव में शुरुआती कोष्ठक वाली रेखा से शुरू नहीं होते हैं। विम केवल उस पंक्ति पर गुना पाठ का उपयोग करता है जहां गुना शुरू होता है। उदाहरण के लिए, देखें कि ब्रेस प्लेसमेंट सी में इसे कैसे प्रभावित करता है: imgur.com/3h70dPf,wfCLPm7
muru

लेकिन यह पायथन है, इसमें कोई ब्रेसिज़ शामिल नहीं है ( from __future__ import braces) ... आपने तह को कैसे कॉन्फ़िगर किया? और क्या आप इस कोड को स्निपेट (या समस्या को प्रदर्शित करने वाले अन्य) को चिपका सकते हैं? विम एक ही लाइन से गुना होता है, लेकिन जैसा कि मुरू ने उल्लेख किया है, आपके तह देर से एक लाइन शुरू करते हैं।
मार्टिन टूरनोइज

@ कारपेट्समर केवल ब्रीज़ के चित्रण के लिए होते हैं जहाँ से गुना शुरू होता है। हास्केल पर भी यही प्रभाव देखा जा सकता है।
मुरु

@MikeHearn मेरा पिछला जवाब पूरी तरह से गलत था। मैंने समस्या के समाधान को शामिल करने के लिए इसे अपडेट किया है।
रिच

जवाबों:


12

दो लाइन बनाम एक लाइन

विम में, एक तह के भीतर सभी लाइनें एक ही लाइन से ढह जाएंगी , और 'foldtext'विकल्प फिर उन पंक्तियों के सारांश (आमतौर पर डैश, मुड़ी हुई लाइनों की संख्या, और पहली (या सभी) लाइनों) की सामग्री को निर्धारित करता है।

आपके उदाहरण में, विम में केवल {...}पैरामीटर ब्लॉक ही मुड़ा हुआ है; ऊपर की रेखा (जो मापदंडों का उपयोग करती है) तह का हिस्सा नहीं है। इसके विपरीत, अन्य संपादक में, मापदंडों का उपयोग करने वाली रेखा गुना से संबंधित है, और इसका फोल्डटेक्स्ट (विम शब्दावली का उपयोग करने के लिए) उस लाइन प्लस की सामग्री है।

अनुकूल

विम में, सिलवटों को विभिन्न माध्यमों (देखें :help fold-methods) से उत्पन्न किया जा सकता है , और 'filetype'बफर पर निर्भर करता है । गुना में उपरोक्त रेखा को शामिल करने की कठिनाई उस पर निर्भर करती है; के साथ जाँच करें :setlocal foldmethod?इंडेंट फोल्डिंग के साथ , ऐसा कुछ भी नहीं है जिसे आप प्रभावित कर सकते हैं; आपको दूसरी विधि पर स्विच करना होगा। के लिए वाक्य रचना तह, कि वाक्य रचना परिभाषाओं अनुकूल मतलब होगा, और बहुत मुश्किल हो सकता है। यदि अभिव्यक्ति का उपयोग किया जाता है, तो आपके पास बेहतर भाग्य होगा, लेकिन इसका मतलब तर्क को समझना और बदलना होगा। (यह संभावना नहीं है कि फ़िलेटाइप प्लगइन लेखक ने इसे प्रभावित करने के लिए एक कॉन्फ़िगरेशन प्रदान किया है।)

मुड़ी हुई रेखा का संकलित प्रकाश डाला गया

दुर्भाग्य से यह बिल्कुल संभव नहीं है। विम हमेशा Foldedपूरी तह लाइन के लिए हाइलाइट समूह का उपयोग करता है । आप इसे :highlightअपने आदेशों के माध्यम से ट्विक कर सकते हैं ~/.vimrc, लेकिन सिंटैक्स के अलग-अलग भेदभाव खो जाएंगे।


5

विम पहले से ही एक लाइन के रूप में सिलवटों को प्रदर्शित करता है। हालांकि, विम के indentतह में, एक ही इंडेंट वाले सभी लाइनों को एक गुना में शामिल किया गया है। तो आपके स्क्रीनशॉट में, आपके द्वारा "हेडर" (उदाहरण के लिए, एक शुरुआत collection_base_url) के रूप में संदर्भित लाइनें सिलवटों के भीतर नहीं हैं ।

विम के उपयोग से आप एटम की तह के समान कुछ हासिल कर सकते हैं foldexpr foldmethod:

" Finds the indent of a line. The indent of a blank line is the indent of the
" first non-blank line above it.
function! FindIndent(line_number, indent_width)
    " Regular expression for a "blank" line
    let regexp_blank = "^\s*$"

    let non_blank_line = a:line_number
    while non_blank_line > 0 && getline(non_blank_line) =~ regexp_blank
        let non_blank_line = non_blank_line - 1
    endwhile
    return indent(non_blank_line) / a:indent_width
endfunction

" 'foldexpr' for Atom-style indent folding
function! AtomStyleFolding(line_number)
    let indent_width = &shiftwidth

    " Find current indent
    let indent = FindIndent(a:line_number, indent_width)

    " Now find the indent of the next line
    let indent_below = FindIndent(a:line_number + 1, indent_width)

    " Calculate indent level
    if indent_below > indent
        return indent_below
    elseif indent_below < indent
        return "<" . indent
    else
        return indent
    endif
endfunction

set foldexpr=AtomStyleFolding(v:lnum)
set foldmethod=expr

यह एक गुना अभिव्यक्ति को परिभाषित करता है (देखें :help fold-expr) निम्नानुसार है:

  • तुरंत लाईन वाली लाइनों के लिए, यह उस ब्लॉक का इंडेंटेशन लौटाता है जो इस प्रकार है।
  • इंडेंटेड लाइनों के लिए, यह इंडेंटेशन लौटाता है। (इंडिपेंडेंस द्वारा विभाजित इसलिए इंडेंटेशन के प्रत्येक स्तर में 1 से लौटे मूल्य में वृद्धि होती है)
  • इंडेंटेड लाइनों के एक ब्लॉक के अंत में लाइनों के लिए, यह एक स्ट्रिंग लौटाता है "<N", जहां एन इंडेंट पर सेट होता है। यह विम को बताता है कि स्तर एन का एक गुना उस रेखा पर समाप्त होता है।

अपडेट करें

@alxndr टिप्पणियों में पूछता है कि क्या endतह के भीतर रूबी के बहिष्कृत s को शामिल करने के लिए इसका विस्तार करना संभव है । आप " Calculate indent levelनिम्न के साथ अनुभाग को प्रतिस्थापित करके शुरू कर सकते हैं :

if indent_below > indent
    return indent_below
elseif getline(a:line_number) =~ '^\s*end\s*$'
    return "<" . (indent + 1)
else
    return indent
endif

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


महान दृष्टिकोण। क्या इस जवाब को सामान्य रूप से भी कहा जा सकता है कि रूबी ने कहा कि endएक ब्लॉक को खत्म करने के लिए इसके साथ रूबी को भी शामिल किया जा सकता है ।
alxndr

1
@alxndr मैंने अपना उत्तर कुछ चर्चा के साथ संपादित किया है।
रिच

@ रीच: मुझे सब्बल टेक्स्ट फोल्ड भी मिलता है जो केवल ...एक तह टेक्स्ट ब्लॉक के प्रतीक के रूप में लाइन के अंत में एक निशान दिखाता है जो बहुत उपयोगी है और कम से कम व्याकुलता पैदा करता है क्योंकि टेक्स्ट ब्लॉक की पूरी पहली पंक्ति को विम के रूप में उजागर करना है। मैंने आपके गुना को विम के डिफ़ॉल्ट गुना व्यवहार के साथ ऊपर की कोशिश की, सरल काम नहीं करता है। कैसे है कि अजगर के साथ पाठ ब्लॉक की पहली पंक्ति में एक निशान दे गुना है? क्या मुझे एक नया प्रश्न खोलना चाहिए? मैं सिर्फ आपके गुना का फिर से परीक्षण करता हूं, यह वास्तव में इंडेंट लाइन के साथ बहुत अच्छा काम करता है। सुपर धन्यवाद।
त्येन फाम

ये अद्भुत है! मैं एक ऐसी चीज़ की तलाश कर रहा हूँ, जो फोल्डिंग की तरह org-Mode करती है और इससे बहुत मदद मिलती है!
priomsrb
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.