Python kodu için Vim katlamayı kullanmanın önerilen yolu nedir


112

Python kodu için Vim'de kod katlamayı etkinleştirmekle ilgileniyorum. Bunu yapmanın birçok yolunu fark ettim.

Vim'de Python kodu katlamanın tercih edilen bir yolu olan var mı? yani,

  • Kullandığınız ve beğendiğiniz belirli bir Vim eklentiniz var mı?
  • Manuel katlama kullanıyor musunuz veya yorumlara işaretçi yerleştiriyor musunuz?
  • Vim'de Python için kod katlamanın başka önerilen yolları var mı?

Yanıtlar:


117

Şahsen, kodumu işaretçilerle doldurmaya kendimi ikna edemiyorum. Girinti katlamayı kullanmaya oldukça alıştım (ve verimli). Kıvrımları açmak / kapatmak için boşluk çubuğu eşlemem (aşağıya bakın) ve zR ve zM komutlarıyla birlikte, tam evdeyim. Python için mükemmel!

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

81
: foldmethod = ilk girintiyi ayarla. Sadece bunun için googling yapıyordum ve cevabınıza rastladım, çok güzel! :)
tmadsen

47
Arkadaşım da hoşuna gitti set foldnestmax=2, bu şekilde sınıfların yöntemleri katlandı, ancak iç ifadeler değil.
Denilson Sá Maia

9
İkinci eşlemenin neden zf'ye verilen bu yanıtta olduğundan emin değilim. Girinti katlama kullanılıyorsa kullanılmaz. Ancak, manuel katlama yapıyorsanız, haritalama mükemmel bir anlam ifade eder. Ancak za, kıvrımları hızlı bir şekilde açmanın / kapatmanın en iyi yolu gibi görünüyor. Ayrıca, katlamalı gezinmeyi (zk, zj) kullanmanızı tavsiye ederim.
Derek Litz

Vnoremap, manuel haritalama için iyidir. Ftplugin'inizde Python için set foldmethod = indent ekleyin. Ardından, .vimrc dosyanızda foldmethod = manual olarak ayarlayın. Artık boşluk çubuğu haritalama ile hem Python'da hem de Python dışında katlayabilirsiniz
Lionel

26

Python için bu sözdizimi dosyasını kullanıyorum . Katlama yöntemini sözdizimine ayarlar ve tüm sınıfları ve işlevleri katlar, ancak başka hiçbir şey yapmaz.


açıldıktan sonra nasıl katlanır? Kısayolu bulamıyorum! tnx
Moj

Bu sözdizimi dosyasını denedim ve vurgulama için oldukça iyi çalıştı. Ancak soğuk katlama için kesinlikle hiçbir şey yapmadı, 'zM' kullandığımda hiçbir şey olmuyor, bir sınıfta 'za' kullandığımda E490'ı alıyorum (Katlama bulunamadı). Ne yanlış gidiyor?
Dani Gehtdichnixan

+1. İlk denemede python kodu (sınıf, yöntem) katlama benim için harika çalışıyor. Komutları katlamak için Walter'ın ( stackoverflow.com/a/360634/605356 ) harita boşluk çubuğuna yanıtlarını kullanın, ancak bu çözüm (benim için) neredeyse bu kadar iyi çalışmıyor. Referans için teşekkürler @Tomas.
Johnny Utahh

@DaniGehtdichnixan, belki de ihtiyacınız var: AnsiEsc - buna bakın ve bir çözüm bulacağınızı düşünüyorum
serup

10

Yine Python kodunu katlamak için başka bir eklenti. Oldukça basit, belge dizilerini işlemek ve GitHub'da:

SimpylFold

Zevk almak!


Bu en iyi sonucu verir. Hiçbir zaman baş ağrısına neden olmadığı için kod katlamayı düşünmeyi bıraktım.
iankit

Bazen de kat isterdim @iankit if, forve whilebloklar, size değil mi?
iago-lito,

hmm bu çok yardımcı olmayabilir bence. Bu blokları katlarsa, katlanmış haldeyken içeriğin ne olduğu çok net değildir. Ancak yöntemler ve diğer adlandırılmış bloklarla ad her şeyi anlatır. İsmine bakarak katlanmış bloğun ne yaptığını tahmin edebilirim.
iankit

@iankit Bilmiyorum .. Denemek istiyorum. Neden denemiyorsun ? ^ ^
iago-lito 'bırakarak dikkate

7

Python, girintiyi katlamak için, biraz da kendi kodumu yazmak için çok uygundur.Bir belgeyi istediğiniz şekilde sıkıştırabilecekleri ve bir tür içindekiler tablosu işlevi görebilecekleri için işaretleyiciler kullanıyorum. Başka birinin kodunu görüntülerken ikisi arasında geçiş yapmak için vimrc'imde bu var.

#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>




3

Benim için ideal katlama sadece classve defbloklarını katlamaktır, girintili katlama zevkime göre çok fazladır. Sanırım zarif bir çözüm, Tomas'ın bahsettiği buna benzer bir sözdizimi sistemini kullanmak . Bununla birlikte, bunun orijinal sözdizimi dosyasının yerini alması amaçlanmıştır ve orijinalinden daha eski olabilir (yani bu komut dosyası Python 3 sözdiziminden bahsetmez).

Çözümüm, ~/.vim/syntaxklasöre python.vimyalnızca önemli satırlarla (yukarıdaki komut dosyasından alınmıştır) bir dosya yerleştirmek :

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

Ardından katlamayı ile etkinleştirin :set foldmethod=syntax.


1
Bu çözümü beğendim. Ancak bir satırın başında dururlarsa, n kat classve defs ile eşleşmez . İfadeyi pek okuyamadığım için, eşleştirmek için ince ayar yapmaya çalışırken sorun yaşıyorum ^defve ^class. Bu ilginç olsa da, bununla \s*iyi başa çıkması gerekiyor ..
iago-lito '26

2

Python kaynağı, özel bir vimrc dosyasıyla birlikte bir vim sözdizimi eklentisiyle birlikte gelir. Kontrol edinVim'deki python SSS bölümünü


2
Bu sözdizimi dosyası da katlama bilgisi İÇERMEZ. Yani bu sözdizimi dosyasını sözdizimi katlama ile kullanamazsınız.
KFL

2

İçinde .vimrc:

set foldmethod=indent
set shiftwidth=4

Sonra zMhepsini zRgenişletmek için hepsini maskelemek . Ben de ekledim:

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>

Geçebilirsin z1ve z2Little tarafından unindent çok az var.


2

.Vimrc için yazdığım bu küçük vim betiğini gerçekten beğendim. Bu haritalar alt+1, birinci piton girinti düzeyini (sınıf tanımları ve işlevleri) katlamak alt+2ikinci düzey (sınıf yöntemleri) katlanması ve alt+0unfold her şeyi. Yalnızca bir seviye katlanmasını ve iç içe geçmiş alt seviyelerin hiçbirini katlamamasını sağlar. Halen zageçerli blok için katlamayı değiştirmek için kullanabilirsiniz . Not o ^[0, ^[olduğu altzaman, terminal için. Vim betiğinde çok fazla deneyime sahip değilsiniz, bu nedenle işlev hakkında önerilerde bulunmaktan çekinmeyin :)

" 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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.