วิธีที่แนะนำในการใช้ Vim folding สำหรับโค้ด Python คืออะไร


112

ฉันสนใจที่จะเปิดใช้งานการพับโค้ดใน Vim สำหรับโค้ด Python ฉันสังเกตเห็นหลายวิธีในการทำเช่นนั้น

ใครมีวิธีที่ต้องการในการพับรหัส Python ใน Vim หรือไม่? ได้แก่

  • คุณมีปลั๊กอิน Vim ที่คุณใช้และชอบหรือไม่?
  • คุณใช้การพับด้วยมือหรือคุณวางเครื่องหมายไว้ในความคิดเห็นหรือไม่?
  • มีวิธีอื่นที่แนะนำในการพับโค้ดสำหรับ Python ใน Vim หรือไม่?

คำตอบ:


117

โดยส่วนตัวแล้วฉันไม่สามารถโน้มน้าวตัวเองให้ทิ้งรหัสของฉันด้วยเครื่องหมาย ฉันคุ้นเคยกับ (และมีประสิทธิภาพ) มากในการใช้การพับเยื้อง เมื่อรวมกับการทำแผนที่สเปซบาร์ของฉัน (ดูด้านล่าง) เพื่อเปิด / ปิดการพับและคำสั่ง zR และ zM ฉันอยู่ที่บ้าน สมบูรณ์แบบสำหรับ Python!

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

81
: set foldmethod = เยื้องก่อน ฉันกำลัง googling เพียงแค่นี้และสะดุดกับคำตอบของคุณดีมาก! :)
tmadsen

47
เพื่อนของฉันก็ชอบset foldnestmax=2วิธีนี้วิธีการเรียนจะถูกพับ แต่ข้อความภายในไม่ใช่
Denilson Sá Maia

9
ฉันไม่แน่ใจว่าทำไมการแมปที่สองจึงอยู่ในคำตอบของ zf จะไม่ใช้หากใช้การพับเยื้อง อย่างไรก็ตามหากคุณกำลังพับด้วยตนเองการทำแผนที่ก็เหมาะสมอย่างยิ่ง อย่างไรก็ตาม za ดูเหมือนจะเป็นวิธีที่ดีที่สุดในการเปิด / ปิดฝาพับอย่างรวดเร็ว ฉันขอแนะนำให้ใช้การนำทางแบบพับ (zk, zj)
Derek Litz

vnoremap เหมาะสำหรับการทำแผนที่ด้วยตนเอง ใน ftplugin ของคุณเพิ่ม set foldmethod = indent สำหรับ Python จากนั้นใน. vimrc ของคุณให้ตั้งค่า foldmethod = manual ตอนนี้คุณสามารถพับได้ทั้ง Python และไม่ใช่ Python ด้วยการทำแผนที่ spacebar
Lionel

26

ฉันใช้ไฟล์ไวยากรณ์นี้สำหรับ Python ตั้งค่าวิธีการพับเป็นไวยากรณ์และพับคลาสและฟังก์ชันทั้งหมด แต่ไม่มีอะไรอื่น


วิธีพับหลังกางออก? ฉันหาทางลัดไม่เจอ! tnx
Moj

ลองใช้ไฟล์ไวยากรณ์นี้แล้วและทำงานได้ดีพอสมควรสำหรับการเน้น แต่มันไม่ได้ทำอะไรเลยสำหรับการพับเย็นเมื่อฉันใช้ 'zM' ไม่มีอะไรเกิดขึ้นเมื่อฉันใช้ 'za' ในคลาสฉันได้รับ E490 (ไม่พบการพับ) เกิดอะไรขึ้น?
Dani Gehtdichnixan

+1. ในตอนแรกลองรหัส python (คลาสวิธีการ) การพับใช้งานได้ดีสำหรับฉัน ใช้คำตอบของ Walter ( stackoverflow.com/a/360634/605356 ) ในการแมป space bar เพื่อพับคำสั่ง แต่โซลูชันนั้นไม่ได้ผลเช่นกัน (สำหรับฉัน) เหมือนคำตอบนี้ ขอบคุณ @Tomas สำหรับข้อมูลอ้างอิง
Johnny Utahh

@DaniGehtdichnixan บางทีคุณอาจต้องการ: AnsiEsc - มองเข้าไปในนั้นและฉันคิดว่าคุณจะพบทางออก
serup

10

ยังมีปลั๊กอินอื่นสำหรับพับโค้ด Python ค่อนข้างง่ายการจัดการ docstrings และบน GitHub:

SimpylFold

สนุก!


วิธีนี้ได้ผลดีที่สุด ฉันเลิกคิดเกี่ยวกับการพับโค้ดเลยเพราะมันไม่เคยทำให้ปวดหัวเลย
iankit

@iankit บางครั้งฉันหวังว่ามันจะพับif, forและwhileบล็อกที่คุณทำไม่ได้?
iago-lito 'พิจารณาออกจาก

อืมมันอาจจะไม่เป็นประโยชน์มากนักฉันคิดว่า ถ้าเขาพับบล็อกเหล่านี้จะไม่ชัดเจนว่าเนื้อหาคืออะไรในขณะที่อยู่ในสถานะพับ อย่างไรก็ตามด้วยวิธีการและบล็อกชื่ออื่น ๆ ชื่อจะบอกทุกอย่าง ฉันสามารถเดาได้ว่าบล็อกพับทำอะไรอยู่โดยดูจากชื่อของมัน
iankit

@iankit ไม่รู้.. อยากลอง. ทำไมไม่ลอง ? ^ ^
iago-lito 'กำลังพิจารณาออกจาก

7

Python เหมาะอย่างยิ่งสำหรับการพับในการเยื้องบิตสำหรับการเขียนโค้ดของฉันเองฉันใช้เครื่องหมายเนื่องจากสามารถกระทืบเอกสารในแบบที่คุณต้องการและสามารถใช้เป็นสารบัญได้ ฉันมีสิ่งนี้ใน vimrc เพื่อพลิกระหว่างทั้งสองเมื่อฉันดูรหัสของใครบางคน

#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
น่าเสียดายที่ปลั๊กอินนี้ใช้เวลาในการประมวลผลมากกว่าที่ฉันต้องการ (แม้จะเป็นเวอร์ชัน) เนื่องจากฉันต้องการให้กลุ่มของฉันทำงานได้อย่างรวดเร็ว ข้อเสนอแนะอื่น ๆ ?
Paul D.Eden

11
คำตอบนี้ต้องการคำอธิบายจริงๆ
sixtyfootersdude


3

สำหรับผมพับเหมาะที่จะพับเพียงclassและdefบล็อกพับเยื้องมากเกินไปสำหรับรสชาติของฉัน ฉันคิดว่าทางออกที่ดีอย่างหนึ่งคือการใช้ระบบไวยากรณ์เช่นเดียวกับที่ Tomas กล่าวถึง อย่างไรก็ตามไฟล์นี้มีไว้เพื่อแทนที่ไฟล์ไวยากรณ์ดั้งเดิมและอาจจบลงที่เก่ากว่าต้นฉบับ (กล่าวคือสคริปต์นั้นไม่ได้กล่าวถึงไวยากรณ์ Python 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
ฉันชอบวิธีนี้ แต่มันจะไม่ตรงกับ 'n fold classes และdefs ถ้าพวกเขายืนอยู่ที่จุดเริ่มต้นของบรรทัด ตั้งแต่ผมแทบจะไม่สามารถอ่านสำนวนที่ว่าผมมีปัญหาในการพยายามที่จะปรับแต่งเพื่อให้ตรงและ^def ^classนี่เป็นเรื่องที่น่าสงสัยแม้ว่า\s*ควรจะจัดการกับเรื่องนี้ได้ดี ..
iago-lito 'กำลังพิจารณาออกจาก

2

ซอร์ส Python มาพร้อมกับปลั๊กอินไวยากรณ์แบบกลุ่มพร้อมกับไฟล์ vimrc ที่กำหนดเอง ตรวจสอบคำถามที่พบบ่อยเกี่ยวกับ python บน vim


2
ไฟล์ไวยากรณ์นี้ไม่มีข้อมูลการพับเช่นกัน คุณจึงไม่สามารถใช้ไฟล์ไวยากรณ์นี้กับการพับไวยากรณ์ได้
KFL

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

ฉันชอบสคริปต์กลุ่มเล็ก ๆ ที่ฉันเขียนสำหรับ. vimrc แผนที่alt+1เพื่อพับระดับการเยื้อง python แรก (นิยามคลาสและฟังก์ชัน) alt+2เพื่อพับระดับที่สอง (วิธีการคลาส) และalt+0เพื่อคลี่ทุกอย่าง ทำให้แน่ใจว่าพับได้เพียงระดับเดียวและไม่พับระดับย่อยที่ซ้อนกัน คุณยังสามารถใช้zaเพื่อสลับการพับสำหรับบล็อกปัจจุบันได้ ทราบว่าใน^[0ที่^[เป็นaltขั้วของฉัน ไม่มีประสบการณ์ใน vim script มากนักดังนั้นอย่าลังเลที่จะให้คำแนะนำเกี่ยวกับฟังก์ชัน :)

" 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 บน Mac: stackoverflow.com/questions/7501092/can-i-map-alt-key-in-vim
Mike Bannister
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.