Vim แสดงการพับเป็นบรรทัดเดียวแล้ว อย่างไรก็ตามในการindent
พับของ Vim เส้นทั้งหมดที่มีการเยื้องเดียวกันจะรวมอยู่ในการพับ ดังนั้นในภาพหน้าจอของคุณบรรทัดที่คุณอ้างถึงว่าเป็น "ส่วนหัว" (เช่นเริ่มต้นcollection_base_url
) ไม่ได้อยู่ในรอยพับ
คุณสามารถบรรลุสิ่งที่คล้ายกับการพับอะตอมโดยใช้ Vim's foldexpr
foldmethod
:
" Finds the indent of a line. The indent of a blank line is the indent of the
" first non-blank line above it.
function! FindIndent(line_number, indent_width)
" Regular expression for a "blank" line
let regexp_blank = "^\s*$"
let non_blank_line = a:line_number
while non_blank_line > 0 && getline(non_blank_line) =~ regexp_blank
let non_blank_line = non_blank_line - 1
endwhile
return indent(non_blank_line) / a:indent_width
endfunction
" 'foldexpr' for Atom-style indent folding
function! AtomStyleFolding(line_number)
let indent_width = &shiftwidth
" Find current indent
let indent = FindIndent(a:line_number, indent_width)
" Now find the indent of the next line
let indent_below = FindIndent(a:line_number + 1, indent_width)
" Calculate indent level
if indent_below > indent
return indent_below
elseif indent_below < indent
return "<" . indent
else
return indent
endif
endfunction
set foldexpr=AtomStyleFolding(v:lnum)
set foldmethod=expr
สิ่งนี้นิยามนิพจน์การพับ (ดู:help fold-expr
) ดังนี้:
- สำหรับบรรทัดก่อนหน้าบรรทัดที่เยื้องมันจะส่งคืนการเยื้องของบล็อกที่ตามมา
- สำหรับบรรทัดที่เยื้องมันจะส่งคืนการเยื้อง (หารด้วย shiftwidth ดังนั้นแต่ละระดับของการเยื้องจะเพิ่มค่าที่ส่งคืนด้วย 1)
- สำหรับบรรทัดที่ส่วนท้ายของบล็อกของบรรทัดที่เยื้องมันจะส่งคืนสตริง
"<N"
โดยที่ N ถูกตั้งค่าเป็นเยื้อง สิ่งนี้จะบอกกลุ่มว่าการพับระดับ N เสร็จสิ้นในบรรทัดนั้น
ปรับปรุง
@alxndr ถามในความคิดเห็นว่าเป็นไปได้หรือไม่ที่จะขยายสิ่งนี้เพื่อรวมรูบีของ Ruby end
ที่อยู่ในรอยพับ คุณสามารถเริ่มต้นด้วยการแทนที่" Calculate indent level
ส่วนด้วยสิ่งต่อไปนี้:
if indent_below > indent
return indent_below
elseif getline(a:line_number) =~ '^\s*end\s*$'
return "<" . (indent + 1)
else
return indent
endif
ตามที่เป็นอยู่นี่ไม่ใช่โซลูชันที่แข็งแกร่งที่สุด (เช่นจะล้มเหลวหากend
ข้อความอยู่ในบรรทัดเดียวกันหลังจากเซมิโคลอน) คุณสามารถปรับเปลี่ยนนิพจน์ทั่วไปและรหัสโดยรอบเพื่อแก้ไขปัญหานี้ แต่ขณะนี้คุณอยู่ในขอบเขตของการแยกวิเคราะห์ไวยากรณ์ที่แท้จริงของไฟล์ฉันสงสัยว่าสิ่งต่าง ๆ อาจมีความซับซ้อนมากขึ้นก่อนที่คุณจะมีทางออกที่ดี