क्या एक बार में कई vim फोल्डिंग विधियों का उपयोग करने का कोई तरीका है?


14

मैंने अपने में foldmethod=indentसेट किया है ~/.vimrc, और सामान्य तौर पर जो मेरे लिए काम करता है और मैं इसे रखना चाहूंगा।

हालाँकि, कुछ फाइलें हैं, जिन्हें मैं नियमित रूप से संपादित करता हूं (और जो मेरे विशेष नियंत्रण में हैं), जहां मैं एक मार्कर-आधारित प्रणाली में जोड़ना चाहता हूं, विशेष रूप से ताकि जब मैं फ़ाइल को एक बड़े खंड में खोलूं तो मैं शायद ही कभी देखो (जो पहले से ही इंडेंट द्वारा 'सीमांकित' है) पूर्व-मुड़ा हुआ है। ऐसा लगता है कि foldmethod=marker(मैं फ़ाइल इन 'पूर्व सिलवटों' इंगित करने के लिए यदि आवश्यक हो तो में अजीब टिप्पणी कोई आपत्ति नहीं है) मुझे ऐसा करने की अनुमति होगी, लेकिन मैं अभी भी चाहते हैं foldmethod=indentतो सेट है कि मैं उपयोग कर सकते हैं zc, zoऔर ऐसा है तो के लिए पर इंडेंट द्वारा वर्गों को गुना या प्रकट करना। जहाँ तक मैं बता सकता हूँ कि मैं कई मूल्यों पर फोल्डमेथोड सेट नहीं कर सकता।

वहाँ एक और तरीका है कि मैं इसे हासिल कर सकता हूं (आदर्श रूप से फ़ाइल में एम्बेडेड कुछ का उपयोग करके)?


मैं मार्कर और इंडेंट दोनों तरीकों को एक ही समय में प्राप्त करने की कोशिश कर रहा हूं। मेरा यह भी मानना ​​है कि फोल्ड एक्सप्रेशन का उपयोग करना सबसे अच्छा विकल्प है। क्या आपको इंडेंट और मार्कर दोनों से मेल खाने के लिए एक अभिव्यक्ति मिली?
17

1
@ जेपी_ नहीं, 'डर नहीं।
एंड्रयू फेरियर

जवाबों:


10

प्रत्येक विंडो का अपना स्थानीय मूल्य हो सकता है 'foldmethod'; आपने जो तय किया है ~/.vimrcवह सिर्फ वैश्विक डिफ़ॉल्ट है। किसी विशेष बफर के लिए एक अलग स्थानीय मान सेट करने के कई तरीके हैं :

  1. मैन्युअल रूप से :setlocal foldmethod=marker
  2. किसी विशेष फ़ाइल प्रकार के लिए (जैसे जावा फ़ाइलें): :autocmd FileType java setlocal foldmethod=marker(या में ~/.vim/after/ftplugin/java.vim)
  3. विशेष फ़ाइल के लिए: :autocmd BufRead /path/to/file setlocal foldmethod=marker
  4. एक मॉडल के माध्यम से फ़ाइल के अंदर (क्योंकि आपको वैसे भी मार्करों को जोड़ना है, मैं इसे पसंद करूंगा):

/* vim: set fdm=manual : */

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

चूँकि वह संभवत: वह नहीं है जिसे आप सुनना चाहते हैं, आप :autocmd CursorMovedवर्तमान लाइन के आधार पर फोल्डेमेथोड स्विच के साथ मिलकर कुछ हैक कर सकते हैं :

" Use markers when in the first 100 lines, else use indent.
:autocmd CursorMoved,CursorMovedI <buffer> let &l:foldmethod = (line('.') <= 100 ? 'manual' : 'indent')

1
धन्यवाद। तो यह मुझे बताता है कि मैं उस बफर के अंदर मार्कर को फोल्डेथोड सेट कर सकता हूं। लेकिन जो मैं देख रहा हूँ वह कुछ ऐसा है जो अभी भी मुझे इंडेंट फोल्मेथोड का उपयोग करने की अनुमति देता है, जबकि कुछ खंड (जो इंडेंट द्वारा सीमांकित हैं ) पूर्व-मुड़ा हुआ है। अगर मैं ऐसा (4) से ऊपर, zc, zo, और इतने में कार्य नहीं करेंगे पर कि बफर में इरादा के रूप में। मैंने अपना प्रश्न स्पष्ट कर दिया है।
एंड्रयू फेरी

आपका प्रश्न उस पहलू में स्पष्ट नहीं था, स्पष्टीकरण के लिए धन्यवाद। मैंने अपना उत्तर संशोधित कर दिया है।
इंगो करकट

हां, अगर मैं स्पष्ट नहीं था तो माफी मांगता हूं। फोल्डेक्सप्रिंट सबसे अच्छा दृष्टिकोण की तरह लगता है लेकिन यह भी जटिल है। मैं इसे एक कोशिश दे दूँगा, हालांकि। सूचक के लिए +1।
एंड्रयू फेरियर

एक बार फिर धन्यवाद। मैं तहखाना लिखने की कोशिश कर रहा हूं और यहां एक संबंधित क्यू खोला है जो ब्याज की हो सकती है: superuser.com/questions/560167/…
एंड्रयू फेरियर

@IngoKarkat: पंक्ति के नीचे पहले पैराग्राफ में आपने लिखा था कि प्रति बफर केवल एक गुना विधि हो सकती है । मेरा मानना ​​है कि प्रति खिड़की होना चाहिए ।
19j पर garyjohn
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.