2010-06-22 7 views
8

क्या किसी को किसी विधि, या शायद प्लग-इन के बारे में पता है, जो स्वचालित रूप से पाइथन में लंबे डॉकस्ट्रिंग को फोल्ड करेगा? मेरे पास कोड में डॉकस्ट्रिंग हैं जो कई पृष्ठों को फैलाती है, इसलिए पेजिंग उनके माध्यम से पेजिंग रखने में परेशानी होती है। दूसरा मुश्किल हिस्सा यह है कि डॉकस्ट्रिंग में एम्बेडेड पायथन परीक्षण कोड है, जिससे उन्हें को पार्सिंग करना मुश्किल हो सकता है। ध्यान दें कि मुझे केवल संपूर्ण डॉकस्ट्रिंग को स्वचालित रूप से फोल्ड करने की आवश्यकता है, चाहे इसमें क्या हो।वीआईएम में पायथन स्रोत कोड में लंबे डॉकस्ट्रिंग को कैसे फोल्ड करें?

अग्रिम धन्यवाद।

उत्तर

7

यह एक गंदे हैक का थोड़ा सा है, लेकिन आप पाइथन सिंटैक्स फ़ाइल (:sp $VIMRUNTIME/syntax/python.vim) के माध्यम से जा सकते हैं और तीन वाक्यविन्यास क्षेत्रों को ट्रिपल- उद्धृत स्ट्रिंग्स (''' और """ के लिए खोजें) और उन बयानों के अंत में fold कीवर्ड जोड़ें। फिर केवल Python फ़ाइलों के लिए foldmethod=syntax सेट करें और टिप्पणियों को फोल्ड किया जाना चाहिए।

+3

यह पूरी तरह से काम करता है! भविष्य के संदर्भ के लिए, फ़ाइल (कम से कम मेरे मामले में) को बदलना था, जिसे सी: \ vim \ vim72 \ syntax \ python.vim और उन पंक्तियों में शामिल किया गया था जिनमें ट्रिपल सिंगल-कोट्स शामिल हैं: syn क्षेत्र pythonString .. ।, @ वर्तनी करने के लिए बदल किया जा सकता था निम्नलिखित: वर्तनी syn क्षेत्र pythonString ..., @ गुना धन्यवाद फिर से – reckoner

+0

महान काम किया! और निश्चित रूप से यदि आपके पास लिखने की अनुमति नहीं है, तो हमेशा '~/.vim/syntax/python.vim' – slushy

2

मुझे प्लगइन या स्वचालन के बारे में निश्चित नहीं है, लेकिन यदि आप zf/ टाइप करते हैं तो आप कुछ खोज सकते हैं और यह इसके अगले उदाहरण तक पहुंच जाएगा। निम्नलिखित (कर्सर जहां [] है) की तरह एक दस्तावेज़ में तो:

def foo(): 
    """[] 
    Some long docstring 
    that takes up many 
    lines 
    """ 
    pass 

अद्यतन खोज स्ट्रिंग के लिए EDIT2 पर देखो पहले!

आप कमांड zf/"""[ENTER] उपयोग करते हैं, यह वर्तमान पंक्ति (docstring की शुरुआत) """ की अगली आवृत्ति जो docstring के अंत होना चाहिए करने के लिए से सब कुछ गुना चाहिए।

मुझे पता है कि यह स्वचालन नहीं है, लेकिन शायद यह अंतरिम में मदद करेगा, या इसे स्वचालित करने के लिए सही रास्ते का नेतृत्व करेगा। एक बेहतर खोज फ़ंक्शन के लिए संपादन 2 देखें, हालांकि मुझे अभी भी पता नहीं है कि स्वचालित कैसे करें।

उम्मीद है कि इससे मदद मिलती है।

संपादित: एक परिणाम में, आप, /"""\_.\{-}""" के साथ किसी भी docstring के लिए खोज है, हालांकि यह भी docstring भीतर कोड प्राप्त होगा कर सकते हैं। डॉकस्ट्रिंग के बाद फ़ंक्शन परिभाषा की खोज करने के लिए, आप /def\_.\{-}"""\_.\{-}""" का उपयोग कर सकते हैं, हालांकि यह डॉकस्ट्रिंग के अंदर एक डीफ़ पर टूट जाता है।

EDIT2: /def.\{-}):\_s*"""\_.\{-}""" जो किसी भी समारोह एक docstring के बाद खोजना चाहिए: वास्तव में, कुछ और regexs के साथ खेल मेरे लिए इस का नेतृत्व किया। यह def के बाद किसी भी पात्र, ): के बाद """ के बाद """ की तुलना में किसी भी संख्या के बाद लाइनों की खोज करता है, लेकिन हमेशा यह सुनिश्चित करता है कि दूसरा ट्रिपल कोट पहले के बाद तुरंत होता है।

+0

यह डॉकस्ट्रिंग में एम्बेडेड गणितीय फ़ंक्शंस या रिक्त रेखाएं प्रतीत नहीं होता है। मैं इसके साथ खेलना जारी रखूंगा। अच्छा विचार! – reckoner

+0

क्या आपने संपादन 2 में प्रस्तावित एक कोशिश की थी? यह _should_ (एक खतरनाक शब्द है) कम से कम रिक्त रेखा के मामले के लिए ठीक से काम करता है, जब तक डॉकस्ट्रिंग "" और "" के बीच होता है और डॉकस्ट्रिंग में "" कोई अन्य उदाहरण नहीं होता है, जो परिणामस्वरूप होगा अमान्य पायथन कोड में वैसे भी। अगर आपके पास कुछ उदाहरण कोड है तो मुझे कुछ और खेलना अच्छा लगेगा - मैंने हाल ही में रेगेक्स में डाइविंग शुरू कर दिया है। – nearlymonolith

1

अपने .vimrc में जोड़ें:

" folding 
set foldmethod=indent 

हर खरोज है, जो, अजगर में, docstrings करने के लिए अनुवाद में हो जाएगा ताकि ऑटो गुना। यह बहुत बहुत अच्छा काम करता है। कोशिश करो। उपर्युक्त उत्तर सही है, लेकिन कीस्ट्रोक का एक गुच्छा (ब्लाह!)

+0

क्या यह 'if', 'for',' while', आदि को भी फोल्ड करेगा। कथन (चूंकि वे इंडेंटेशन द्वारा भी सीमित हैं? – nearlymonolith

+0

यह होगा, लेकिन मुझे लगता है कि आप इंडेंटेशन की "गहराई" को ट्विक कर सकते हैं। – Daenyth

+0

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

0

आप इसे :set foldmethod=marker foldmarker=""",""" के साथ कर सकते हैं, मुझे लगता है। मैंने इसका परीक्षण नहीं किया है, लेकिन यह चाल चलाना चाहिए। Foldmarker के लिए तर्क शुरू और अंत मार्कर हैं।

+0

होता है यह इंडेंट्स के बयान का पालन करने के तरीके के कारण काम नहीं करता है जिसके परिणामस्वरूप निम्न कोड को फोल्ड किया जाता है । ऐसा लगता है कि यह विधि केवल तभी काम करती है जब आप फोल्डिंग को नियंत्रित करने के लिए उपयुक्त मार्करों के साथ समय से पहले कोड को अलग-अलग चिह्नित करते हैं। – reckoner

+0

क्या यह काम करता है यदि आप इसे कई पंक्तियों पर विभाजित करते हैं जैसे: '"" \ n दस्तावेज़ \ n "" "? – Daenyth

0

मैंने कई साल पहले एक विस्क्रिप्ट प्लगइन लिखा था, लेकिन इसे प्रकाशित करने के लिए कभी नहीं मिला। मैंने इसे gist के रूप में रखा है, लेकिन नीचे दिए गए स्रोत को भी चिपकाया है। मैंने सब्लिमे टेक्स्ट here के लिए अपनी कार्यक्षमता भी दोहराई है।

" 
" Fold multi-line Python comments into one line. 
" 
" Also maps the "-" key to toggle expansion and <C-f> to toggle all folding. 
" 
setlocal foldmethod=syntax 
setlocal foldtext=FoldText() 
setlocal fillchars= 

map <buffer> - za 
map <buffer> <C-f> :call ToggleFold()<CR> 

let b:folded = 1 

hi Folded  gui=bold cterm=bold guifg=cyan ctermfg=cyan guibg=NONE ctermbg=NONE 

function! ToggleFold() 
    if b:folded == 0 
    exec "normal! zM" 
    let b:folded = 1 
    else 
    exec "normal! zR" 
    let b:folded = 0 
    endif 
endfunction 

function! s:Strip(string) 
    return substitute(a:string, '^[[:space:][:return:][:cntrl:]]\+\|[[:space:][:return:][:cntrl:]]\+$', '', '') 
endfunction 

" Extract the first line of a multi-line comment to use as the fold snippet 
function! FoldText() 
    let l:snippet = getline(v:foldstart) 
    if len(s:Strip(l:snippet)) == 3 
    let l:snippet = strpart(l:snippet, 1) . s:Strip(getline(v:foldstart + 1)) 
    endif 
    return '+' . l:snippet . ' ...' 
endfunction 
0

मेरा समाधान SimpylFold का उपयोग करना शामिल है। Vundle का उपयोग कर इसे स्थापित करने के बाद, मैं अपने vimrc फ़ाइल में इस डाल:

autocmd FileType python setlocal foldlevel=2 

कौन सा सब docstrings डिफ़ॉल्ट रूप से मुड़ा हुआ है जब आप एक अजगर फ़ाइल है, जो सुपर भयानक है खोलने बनाता है।

संबंधित मुद्दे