มีวิธีใช้หลายวิธีในการพับ vim ในคราวเดียวหรือไม่?


14

ฉันได้foldmethod=indentตั้งไว้ในของฉัน~/.vimrcและโดยทั่วไปที่เหมาะกับฉันและฉันต้องการที่จะเก็บไว้

อย่างไรก็ตามมีไฟล์บางไฟล์ที่ฉันแก้ไขเป็นประจำ (และอยู่ภายใต้การควบคุมพิเศษของฉัน) ซึ่งฉันต้องการเพิ่มในระบบที่ใช้มาร์กเกอร์เป็นพิเศษโดยเฉพาะอย่างยิ่งเมื่อฉันเปิดไฟล์ส่วนใหญ่ฉัน ดูที่ไม่ค่อย (ซึ่งถูก 'คั่น' โดยการเยื้อง) จะถูกพับไว้ล่วงหน้า ดูเหมือนว่าfoldmethod=markerจะช่วยให้ฉันทำอย่างนั้น (ผมไม่ทราบความคิดเห็นของแปลกในไฟล์เพื่อบ่งชี้เหล่านี้ก่อนเท่า 'ถ้าจำเป็น) แต่ฉันยังคงต้องการfoldmethod=indentการตั้งค่าเพื่อที่ฉันสามารถใช้zc, zoและอื่น ๆ แล้ว พับหรือแฉส่วนโดยเยื้อง เท่าที่ฉันสามารถบอกได้ฉันไม่สามารถตั้งค่า foldmethod เป็นหลายค่าได้

มีวิธีอื่นที่ฉันสามารถทำได้หรือไม่ (ใช้สิ่งที่ฝังอยู่ในไฟล์)


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

1
@Jp_ ไม่ 'ไม่กลัว
Andrew Ferrier

คำตอบ:


10

แต่ละหน้าต่างสามารถมีค่าในตัวของมันเอง'foldmethod'; สิ่งที่คุณตั้งไว้~/.vimrcเป็นเพียงค่าเริ่มต้นทั่วโลก มีหลายวิธีในการตั้งค่าท้องถิ่นที่แตกต่างกันสำหรับบัฟเฟอร์เฉพาะ:

  1. ด้วยตนเองด้วย :setlocal foldmethod=marker
  2. สำหรับประเภทไฟล์เฉพาะ (เช่นไฟล์ Java): :autocmd FileType java setlocal foldmethod=marker(หรือใน~/.vim/after/ftplugin/java.vim)
  3. สำหรับไฟล์เฉพาะ: :autocmd BufRead /path/to/file setlocal foldmethod=marker
  4. ภายในไฟล์ตัวเองผ่านทางmodeline (เนื่องจากคุณต้องเพิ่มเครื่องหมายแล้วฉันต้องการสิ่งนี้):

/* vim: set fdm=manual : */

ยังคงสามารถมีได้เพียงหนึ่งวิธีการพับภายในหน้าต่างเดียว หากคุณต้องการใช้กลยุทธ์ที่แตกต่างกันคุณต้องเลือกวิธีที่ยืดหยุ่นมากขึ้น (เช่นexpr) และใช้วิธี "อื่น ๆ " อีกครั้งที่นั่น (เช่นโดย'foldexpr'พิจารณาการเยื้อง) หรือคุณใช้การแบ่งหน้าต่างสองแบบสำหรับบัฟเฟอร์เดียวกันและตั้งค่า foldmethods ที่แตกต่างกันสำหรับแต่ละการแยก

เนื่องจากนั่นอาจไม่ใช่สิ่งที่คุณต้องการได้ยินคุณสามารถแฮ็กบางอย่างพร้อมกับ:autocmd CursorMovedสวิตช์ที่ทำตามวิธีการตามบรรทัดปัจจุบัน:

" Use markers when in the first 100 lines, else use indent.
:autocmd CursorMoved,CursorMovedI <buffer> let &l:foldmethod = (line('.') <= 100 ? 'manual' : 'indent')

1
ขอบคุณ นี่บอกฉันว่าฉันสามารถตั้งค่า foldmethod เพื่อทำเครื่องหมายภายในบัฟเฟอร์นั้น แต่สิ่งที่ผมกำลังมองหาบางสิ่งบางอย่างที่ยังคงช่วยให้ฉันเพื่อใช้ foldmethod เยื้องขณะที่มีบางส่วน (ซึ่งจะถูกคั่นด้วยเยื้อง) ก่อนพับ ถ้าฉันทำ (4) ข้างต้นzc, zoและอื่น ๆ จะไม่ทำงานตามที่ตั้งใจไว้ในบัฟเฟอร์ที่ ฉันได้ชี้แจงคำถามของฉัน
Andrew Ferrier

คำถามของคุณไม่ชัดเจนในด้านนั้นขอบคุณสำหรับการชี้แจง ฉันแก้ไขคำตอบแล้ว
Ingo Karkat

ใช่ขอโทษถ้าฉันไม่ชัดเจน foldexpr ดูเหมือนวิธีที่ดีที่สุด แต่ก็ซับซ้อนเช่นกัน ฉันจะลองดูนะ +1 สำหรับตัวชี้
Andrew Ferrier

ขอบคุณอีกครั้ง. ฉันพยายามเขียน foldexpr และเปิดคิวที่เกี่ยวข้องที่นี่ซึ่งอาจเป็นที่สนใจ: superuser.com/questions/560167/ …
Andrew Ferrier

@IngoKarkat: ในวรรคแรกต่ำกว่าเส้นที่คุณเขียนว่าสามารถมีได้เพียงวิธีการพับหนึ่งต่อบัฟเฟอร์ ผมเชื่อว่าควรจะต่อหน้าต่าง
garyjohn
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.