Apa cara yang direkomendasikan untuk menggunakan pelipatan Vim untuk kode Python

112

Saya tertarik untuk mengaktifkan pelipatan kode di Vim untuk kode Python. Saya telah memperhatikan banyak cara untuk melakukannya.

Apakah ada yang punya cara yang lebih disukai untuk melakukan pelipatan kode Python di Vim? Yaitu,

  • Apakah Anda memiliki plugin Vim tertentu yang Anda gunakan dan sukai?
  • Apakah Anda menggunakan pelipatan manual atau Anda menempatkan spidol di komentar?
  • Adakah cara lain yang direkomendasikan untuk melakukan pelipatan kode untuk Python di Vim?
Paul D. Eden
sumber

Jawaban:

117

Secara pribadi saya tidak dapat meyakinkan diri saya untuk mengotori kode saya dengan spidol. Saya sudah cukup terbiasa (dan efisien) dalam menggunakan pelipatan indentasi. Bersama dengan pemetaan spasi saya (lihat di bawah) untuk membuka / menutup lipatan dan perintah zR dan zM, saya benar-benar di rumah. Sempurna untuk Python!

set foldmethod=indent
nnoremap <space> za
vnoremap <space> zf
Walter
sumber
81
: setel foldmethod = indentasi dulu. Saya googling hanya untuk ini dan menemukan jawaban Anda, sangat bagus! :)
tmadsen
47
Teman saya juga suka set foldnestmax=2, dengan cara ini metode kelas dilipat, tetapi pernyataan internal tidak.
Denilson Sá Maia
9
Saya tidak yakin mengapa pemetaan kedua ada di jawaban untuk zf ini. Ini tidak digunakan jika melipat indentasi digunakan. Namun, jika Anda melakukan pelipatan manual, pemetaan akan sangat masuk akal. za, bagaimanapun, tampaknya menjadi cara terbaik untuk membuka / menutup lipatan dengan cepat. Saya juga merekomendasikan menggunakan navigasi lipat (zk, zj).
Derek Litz
Vnoremap bagus untuk pemetaan manual. Di ftplugin Anda, tambahkan set foldmethod = indent untuk Python. Kemudian, di .vimrc Anda, setel foldmethod = manual. Sekarang, Anda dapat melipat dengan Python dan non-Python dengan pemetaan bilah spasi
Lionel
26

Saya menggunakan file sintaks ini untuk Python. Ini menetapkan metode lipat untuk sintaks dan melipat semua kelas dan fungsi, tetapi tidak ada yang lain.


sumber
bagaimana cara melipat setelah terungkap? Saya tidak dapat menemukan jalan pintas! tnx
Moj
Sudah mencoba file sintaks ini dan berfungsi dengan cukup baik untuk penyorotan. Tapi itu sama sekali tidak ada untuk cold folding, ketika saya menggunakan 'zM' tidak ada yang terjadi, ketika saya menggunakan 'za' di kelas saya mendapatkan E490 (Tidak ada Fold yang ditemukan). Apa yang salah?
Dani Gehtdichnixan
+1. Pada percobaan pertama, pelipatan kode python (kelas, metode) bekerja sangat baik bagi saya. Gunakan jawaban Walter ( stackoverflow.com/a/360634/605356 ) untuk memetakan bilah spasi untuk melipat perintah, tetapi solusi itu tidak berfungsi sebaik (bagi saya) seperti yang ini. Terima kasih @Tomas atas referensinya.
Johnny Utahh
@DaniGehtdichnixan, mungkin Anda perlu: AnsiEsc - lihat itu dan saya pikir Anda akan menemukan solusinya
serup
10

Namun plugin lain untuk melipat kode Python. Agak sederhana, menangani docstrings, dan di GitHub:

SimpylFold

Nikmati!

iago-lito 'mempertimbangkan untuk pergi
sumber
Ini bekerja paling baik. Saya telah berhenti berpikir tentang pelipatan kode sama sekali karena tidak pernah menyebabkan sakit kepala.
iankit
@iankit Saya terkadang berharap itu juga akan melipat if, fordan whilememblokir, bukan?
iago-lito 'mempertimbangkan untuk berangkat
hmm yang mungkin tidak terlalu membantu saya pikir. Jika dia melipat balok ini, tidak begitu jelas apa isinya saat dalam keadaan terlipat. Namun dengan metode dan blok bernama lainnya, nama tersebut menceritakan semuanya. Saya bisa menebak apa yang dilakukan blok terlipat dengan melihat namanya.
iankit
@iankit Saya tidak tahu .. Saya ingin mencoba. Mengapa tidak mencoba ? ^ ^
iago-lito 'mempertimbangkan berangkat
7

Python sangat cocok untuk melipat pada indentasi, bit untuk menulis kode saya sendiri, saya menggunakan spidol karena mereka dapat memecahkan dokumen sesuai keinginan Anda dan dapat berfungsi sebagai semacam daftar isi. Saya memiliki ini di vimrc saya untuk beralih di antara keduanya ketika saya melihat kode orang lain.

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

sumber
5

Saya sangat suka python_ifoldpluginnya .

Nick Presta
sumber
1
Sayangnya, plugin ini menggunakan lebih banyak waktu prosesor daripada yang saya inginkan (bahkan dengan versinya) karena saya ingin vim saya tetap cepat. Ada saran lain?
Paul D. Eden
11
Jawaban ini sangat membutuhkan penjelasan.
sixtyfootersdude
3

Bagi saya lipatan yang ideal adalah melipat balok classdan saja def, lipatan indentasi terlalu berlebihan untuk selera saya. Saya pikir salah satu solusi elegan adalah dengan menggunakan sistem sintaks seperti ini satu disebutkan oleh Tomas. Namun, yang ini dimaksudkan untuk menggantikan file sintaks asli dan mungkin berakhir lebih lama dari aslinya (yaitu skrip itu tidak menyebutkan sintaks Python 3).

Solusi saya adalah menempatkan di ~/.vim/syntaxfolder file bernama python.vimhanya dengan baris penting (diambil dari skrip di atas):

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

Kemudian aktifkan lipatan dengan :set foldmethod=syntax.

Genma
sumber
1
Saya suka solusi ini. Tapi itu tidak cocok dengan lipatan classdan defjika mereka berdiri di awal baris. Karena saya hampir tidak bisa membaca ekspresi, saya kesulitan mencoba menyesuaikannya agar cocok ^defdan ^class. Ini aneh meskipun karena \s*harus menangani ini dengan baik ..
iago-lito 'mempertimbangkan berangkat
2

Sumber Python hadir dengan plugin sintaks vim bersama dengan file vimrc kustom. Periksa FAQ python di vim

ONODEVO
sumber
2
File sintaks ini juga TIDAK berisi informasi lipat. Jadi Anda tidak dapat menggunakan file sintaks ini dengan sintaks lipat.
KFL
2

Di Anda .vimrc:

set foldmethod=indent
set shiftwidth=4

Kemudian zMuntuk menutupi semua zRuntuk memperluas semua. Saya juga menambahkan:

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>

Jadi Anda bisa z1dan z2melepaskan indentasi sedikit demi sedikit.

Tinmarino
sumber
2

Saya sangat suka skrip vim kecil yang saya tulis untuk .vimrc. Ini memetakan alt+1untuk melipat tingkat indentasi python pertama (definisi kelas dan fungsi), alt+2untuk melipat tingkat kedua (metode kelas), dan alt+0untuk membuka semuanya. Itu memastikan itu hanya melipat satu tingkat dan tidak melipat salah satu sub tingkat bersarang. Anda masih dapat menggunakan zatoggle folding untuk blok saat ini. Perhatikan bahwa di ^[0, ^[adalah altuntuk terminal saya. Tidak memiliki banyak pengalaman dalam skrip vim jadi jangan ragu untuk memberikan saran tentang fungsinya :)

" 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
Berikan Buster
sumber
1
Untuk menggunakan tombol alt di Mac: stackoverflow.com/questions/7501092/can-i-map-alt-key-in-vim
Mike Bannister