पायथन कोड के लिए विम तह का उपयोग करने के लिए अनुशंसित तरीका क्या है


112

मैं पायथन कोड के लिए विम में कोड तह को सक्षम करने में रुचि रखता हूं। मैंने ऐसा करने के कई तरीके देखे हैं।

क्या किसी के पास विम में पाइथन कोड फोल्ड करने का पसंदीदा तरीका है? अर्थात,

  • क्या आपके पास एक विशेष विम प्लगइन है जो आप उपयोग करते हैं और पसंद करते हैं?
  • क्या आप मैन्युअल तह का उपयोग करते हैं या क्या आप टिप्पणियों में मार्कर लगाते हैं?
  • विम में पायथन के लिए कोड तह करने के लिए किसी अन्य अनुशंसित तरीके?

जवाबों:


117

व्यक्तिगत रूप से मैं अपने कोड को मार्करों के साथ लिटाने के लिए खुद को नहीं मना सकता। मैं इंडेंट-फोल्डिंग का उपयोग करने के लिए (और कुशल) काफी अभ्यस्त हो गया हूं। सिलवटों और zR और zM कमांड खोलने / बंद करने के लिए स्पेस बार (नीचे देखें) की मेरी मैपिंग के साथ, मैं घर पर सही हूं। अजगर के लिए बिल्कुल सही!

set foldmethod=indent
nnoremap <space> za
vnoremap <space> zf

81
: सेट तहमेठोड = पहले इंडेंट करें। मैं सिर्फ इस के लिए googling था और आपके जवाब पर ठोकर खाई, बहुत अच्छा! :)
tmadsen

47
मेरे दोस्त को भी पसंद आया set foldnestmax=2, इस तरह से कक्षाओं के तरीके मुड़े हैं, लेकिन आंतरिक कथन नहीं हैं।
डेनिलसन सा मैया

9
मैं निश्चित नहीं हूँ कि दूसरी मैपिंग zf के उत्तर में क्यों है। यदि इंडेंट-फोल्डिंग का उपयोग किया जा रहा है तो इसका उपयोग नहीं किया जाता है। हालाँकि, यदि आप मैन्युअल रूप से फोल्डिंग कर रहे हैं तो मैपिंग सही समझ में आता है। ज़ा, हालांकि, जल्दी से सिलवटों को खोलने / बंद करने का सबसे अच्छा तरीका लगता है। मैं तह नेविगेशन (zk, zj) का उपयोग करने की भी सलाह देता हूं।
डेरेक लिट्ज

मैनुअल मैपिंग के लिए vnoremap अच्छा है। अपने फुटप्लगिन में, अजगर के लिए सेट तहमेथोड = इंडेंट जोड़ें। फिर, अपने .vimrc में, foldmethod = मैन्युअल सेट करें। अब, आप पायथन और गैर-पायथन दोनों को स्पेसबार मैपिंग के साथ मोड़ सकते हैं
लियोनेल

26

मैं पायथन के लिए इस सिंटैक्स फ़ाइल का उपयोग करता हूं । यह सभी वर्गों और कार्यों को सिलना और तह करने के लिए तह विधि सेट करता है, लेकिन कुछ और नहीं।


खुलासा करने के बाद कैसे मोड़ें? मैं शॉर्टकट नहीं ढूँढ सकता! tnx
Moj

इस सिंटैक्स फ़ाइल की कोशिश की और यह हाइलाइटिंग के लिए यथोचित काम किया। लेकिन यह ठंडा तह के लिए बिल्कुल कुछ नहीं था, जब मैं 'zM' का उपयोग करता हूं तो कुछ भी नहीं होता है, जब मैं एक वर्ग में 'za' का उपयोग करता हूं तो मुझे E490 (कोई गुना नहीं मिला) मिलता है। क्या गलत हो रहा है?
दानी गेहदीचिकन ने २

+1। पहले प्रयास में, अजगर कोड (वर्ग, विधि) तह मेरे लिए अद्भुत काम करता है। Employ Walter's ( stackoverflow.com/a/360634/605356 ) कमांड को फोल्ड करने के लिए स्पेस बार मैप करने का जवाब देता है, लेकिन यह समाधान लगभग (मेरे लिए) भी काम नहीं करता है। धन्यवाद @Tomas संदर्भ के लिए।
जॉनी यूटाह

@ दानीगेटीचिनिक्सन, शायद आपको चाहिए: AnsiEsc - उस पर गौर करें और मुझे लगता है कि आपको एक समाधान मिलेगा
serup

10

फिर भी पायथन कोड को तह करने के लिए एक और प्लगइन। इसके बजाय सरल, डॉकस्ट्रिंग्स को संभालना, और गिटहब पर:

SimpylFold

का आनंद लें!


यह सबसे अच्छा काम करता है। मैंने कोड फोल्डिंग के बारे में सोचना बिल्कुल बंद कर दिया है क्योंकि इससे कभी कोई सिरदर्द नहीं हुआ।
अंक

@iankit मुझे कभी-कभी लगता है कि यह भी गुना होगा if, forऔर whileब्लॉक, क्या आप नहीं?
Iago-lito '

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

@iankit मुझे नहीं पता .. मैं कोशिश करना चाहूँगा। कोशिश क्यों नहीं कर रहे हैं ? ^ ^
iago-lito '15

7

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

#Toggle fold methods \fo
let g:FoldMethod = 0
map <leader>fo :call ToggleFold()<cr>
fun! ToggleFold()
    if g:FoldMethod == 0
        exe 'set foldmethod=indent'
        let g:FoldMethod = 1
    else
        exe 'set foldmethod=marker'
        let g:FoldMethod = 0
    endif
endfun
#Add markers (trigger on class Foo line)
nnoremap ,f2 ^wywO#<c-r>0 {{{2<esc>
nnoremap ,f3 ^wywO#<c-r>0 {{{3<esc> 
nnoremap ,f4 ^wywO#<c-r>0 {{{4<esc>
nnoremap ,f1 ^wywO#<c-r>0 {{{1<esc>


5

मुझे वास्तव में python_ifoldप्लगइन पसंद है ।


1
दुर्भाग्य से, यह प्लगइन अधिक प्रोसेसर समय का उपयोग करता है जितना मैं (एक संस्करण के साथ भी) पसंद करूंगा क्योंकि मैं अपनी गति को तेज रखना चाहता हूं। कोई अन्य सुझाव?
पॉल डी। ईडन

11
इस जवाब को वास्तव में विवरण की आवश्यकता है।
साठफुटेरसुडे


3

मेरे लिए आदर्श तह सिर्फ classऔर defब्लॉक को मोड़ना है, मेरे स्वाद के लिए इंडेंट फोल्डिंग बहुत अधिक है। मुझे लगता है कि एक सुरुचिपूर्ण समाधान इस तरह वाक्यविन्यास प्रणाली का उपयोग करने के लिए है एक टॉमस ने उल्लेख किया। हालाँकि, यह मूल सिंटैक्स फ़ाइल को बदलने के लिए है और यह मूल (यानी कि स्क्रिप्ट पायथन 3 सिंटैक्स का उल्लेख नहीं करता है) की तुलना में पुरानी हो सकती है।

मेरा समाधान ~/.vim/syntaxफ़ोल्डर में python.vimकेवल महत्वपूर्ण लाइनों (उपरोक्त स्क्रिप्ट से ली गई) नाम की एक फ़ाइल को रखना है :

syn match   pythonDefStatement  /^\s*\%(def\|class\)/
       \ nextgroup=pythonFunction skipwhite
syn region  pythonFunctionFold  start="^\z(\s*\)\%(def\|class\)\>"
       \ end="\ze\%(\s*\n\)\+\%(\z1\s\)\@!." fold transparent

hi link pythonDefStatement Statement

तो बस के साथ तह सक्रिय करें :set foldmethod=syntax


1
मुझे यह समाधान पसंद है। लेकिन यह 'एन फोल्ड classएस ' से मेल नहीं खाता है और defयदि वे एक लाइन की शुरुआत में खड़े होते हैं। चूंकि मैं अभिव्यक्ति को मुश्किल से पढ़ सकता हूं, इसलिए मैं मैच के लिए इसे ट्विक करने की कोशिश कर रहा हूं ^defऔर ^class। हालांकि यह उत्सुक है क्योंकि \s*इसके साथ अच्छी तरह से निपटना चाहिए ..
iago-lito 'पर विचार कर

2

पायथन स्रोत कस्टम विम फ़ाइल के साथ एक विम सिंटैक्स प्लगइन के साथ आता है। विम पर अजगर अक्सर पूछे जाने वाले प्रश्न की जाँच करें


2
इस सिंटैक्स फ़ाइल में तह जानकारी नहीं होती है। तो आप इस सिंटैक्स फ़ाइल को सिंटैक्स तह के साथ उपयोग नहीं कर सकते।
केएफएल

2

अपने में .vimrc:

set foldmethod=indent
set shiftwidth=4

फिर zMसभी zRका विस्तार करने के लिए सभी को मुखौटा । मैंने भी जोड़ा:

nnoremap <space> za
vnoremap <space> zf
map z1  :set foldlevel=0<CR><Esc>
map z2  :set foldlevel=1<CR><Esc>
map z3  :set foldlevel=2<CR><Esc>
map z4  :set foldlevel=3<CR><Esc>
map z5  :set foldlevel=4<CR><Esc>
map z6  :set foldlevel=5<CR><Esc>
map z7  :set foldlevel=6<CR><Esc>
map z8  :set foldlevel=7<CR><Esc>
map z9  :set foldlevel=8<CR><Esc>

तो आप कर सकते हैं z1और एक z2छोटे से कम करने के लिए।


2

मैं वास्तव में इस छोटी vim स्क्रिप्ट को पसंद करता हूं, जिसे मैंने .vimrc के लिए लिखा था। यह alt+1पहले पायथन इंडेंट लेवल (क्लास की परिभाषाएँ और फ़ंक्शंस) alt+2को फोल्ड करने के लिए, दूसरे लेवल (क्लास मेथड्स) को फोल्ड alt+0करने के लिए और सबकुछ अनफॉलो करने के लिए मैप करता है। यह सुनिश्चित करता है कि यह केवल एक स्तर को फोल्ड करता है और नेस्टेड उप स्तरों में से किसी को भी गुना नहीं करता है। आप अभी भी zaवर्तमान ब्लॉक के लिए टॉगल फोल्डिंग का उपयोग कर सकते हैं । नोट में है कि ^[0, ^[है altमेरी टर्मिनल के लिए। Vim स्क्रिप्ट में बहुत अनुभव नहीं है इसलिए फंक्शन पर सुझाव देने के लिए स्वतंत्र महसूस करें :)

" Python folding
nnoremap ^[0 zR<CR>
nnoremap ^[1 :call Fold(0)<CR>
nnoremap ^[2 :call Fold(1)<CR>
function Fold(level)
    :let b:max = a:level + 1
    :set foldmethod=indent
    :execute 'set foldnestmax='.b:max
    :execute 'set foldlevel='.a:level
endfunction

1
मैक पर alt कीज का उपयोग करने के लिए: stackoverflow.com/questions/7501092/can-i-map-alt-key-in-vim
माइक बैनिस्टर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.