วิธีพับความคิดเห็น


16

ไวยากรณ์foldmethodดีมาก แต่บางครั้งฉันต้องการพับความคิดเห็นในไฟล์ต้นฉบับ

การพับไวยากรณ์ของความคิดเห็นใช้ได้กับความคิดเห็น C-Style เท่านั้นเช่น:

/*
 ...
 */

แต่ไม่ใช่สำหรับคอมเมนต์สำเร็จรูปที่ชอบ:

//
//
// ...
//

หรือแม้กระทั่งสำหรับบล็อกความคิดเห็นในภาษาที่ไม่เหมือน C เช่น:

#
#
# ...
#

ฉันจะกำหนดค่าสิ่งนี้ด้วย vim ได้อย่างไร?


คุณต้องการใช้การซินแทกซ์การพับและการพับความคิดเห็น หรือพับความคิดเห็นเท่านั้น ?
Martin Tournoij

@Carpetsmoker, การพับไวยากรณ์ + การพับความคิดเห็นจะไม่เป็นไรถ้าใครสามารถพูดว่า 'open folds ทั้งหมดยกเว้นความคิดเห็น' มิฉะนั้นความคิดเห็นพับโดยไม่ต้องพับไวยากรณ์จะดีเช่นกัน
maxschlepzig

คำตอบ:


14

การพับเฉพาะความคิดเห็นนั้นค่อนข้างง่ายโดยใช้foldmethod=expr:

set foldmethod=expr foldexpr=getline(v:lnum)=~'^\s*'.&commentstring[0]

นี่จะตรวจสอบว่าบรรทัดเริ่มต้นด้วยช่องว่าง + อักขระความคิดเห็นหรือไม่ โปรดทราบว่านี่ค่อนข้างไร้เดียงสาและอาจไม่สามารถใช้ได้กับทุกภาษา ดังนั้นคุณอาจต้องการใช้ autocmd ให้เฉพาะเจาะจงมากขึ้น:

autocmd FileType c setlocal foldmethod=expr foldexpr=getline(v:lnum)=~'^\s*//'
autocmd FileType python setlocal foldmethod=expr foldexpr=getline(v:lnum)=~'^\s*#'

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับ fold-expr โปรดดู:


การใช้การพับไวยากรณ์และการเพิ่มความคิดเห็นมีส่วนร่วมมากขึ้น สิ่งนี้จะต้องแก้ไขไฟล์ไวยากรณ์ใน/usr/share/vim/vim74/syntax/*.vimและจะเฉพาะเจาะจงกับภาษาที่คุณใช้

โปรดทราบว่าบางประเภทไฟล์ที่มีอยู่แล้วทำเช่นนี้! ตัวอย่างจากruby.vim:

if !exists("ruby_no_comment_fold")
  syn region rubyMultilineComment start="\%(\%(^\s*#.*\n\)\@<!\%(^\s*#.*\n\)\)\%(\(^\s*#.*\n\)\{1,}\)\@=" end="\%(^\s*#.*\n\)\@<=\%(^\s*#.*\n\)\%(^\s*#\)\@!" contains=rubyC
  syn region rubyDocumentation    start="^=begin\ze\%(\s.*\)\=$" end="^=end\%(\s.*\)\=$" contains=rubySpaceError,rubyTodo,@Spell fold
else
  syn region rubyDocumentation    start="^=begin\s*$" end="^=end\s*$" contains=rubySpaceError,rubyTodo,@Spell
endif

2

ฉันชอบการพับด้วยการเยื้อง แต่รวมถึงความคิดเห็นในการพับ (ฉันหมายถึงความคิดเห็นแต่ละรายการจะได้รับการพับในระดับเดียวกันกับบรรทัดก่อนหน้า)

น่าเสียดายที่คำหลัก foldignore ใช้งานได้กับความคิดเห็นหนึ่งบรรทัดเท่านั้น ดังนั้นฉันจึงพับ expr ด้วย vimrc:

set foldmethod=expr
set foldexpr=FoldMethod(v:lnum)

function! FoldMethod(lnum)
  "get string of current line
  let crLine=getline(a:lnum)

  " check if empty line 
  if empty(crLine) "Empty line or end comment 
    return -1 " so same indent level as line before 
  endif 

  " check if comment 
  let a:data=join( map(synstack(a:lnum, 1), 'synIDattr(v:val, "name")') )
  if a:data =~ ".*omment.*"
    return '='
  endif

  "Otherwise return foldlevel equal to indent /shiftwidth (like if
  "foldmethod=indent)
  else  "return indent base fold
    return indent(a:lnum)/&shiftwidth
endfunction

บล็อกสุดท้าย:

indent(a:lnum)/&shiftwidth

ส่งคืนฐานระดับพับเมื่อเยื้อง

และอีกหนึ่ง:

join( map(synstack(a:lnum, 1), 'synIDattr(v:val, "name")') )

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

โปรดทราบว่าคุณยังสามารถ "ตั้งค่า foldtext" ขึ้นอยู่กับว่าคุณต้องการให้ผลลัพธ์เป็นอย่างไร


0

คุณมองเห็นสามารถเลือกบล็อกแสดงความคิดเห็นด้วยแล้วสร้างพับคู่มือvaczf

วัตถุข้อความความคิดเห็นอาจเป็นส่วนขยายของภาษาในการตั้งค่าวัตถุข้อความเสียงเรียกเข้ามาตรฐาน ทดสอบกับไวยากรณ์ไป


1
อันที่จริงacไม่ได้เป็นในตัว แต่ด้วยความเห็นของ tpope gcเป็นวัตถุข้อความ ทางออกที่ดีกว่าคือzfac , zfgcหรือzfipที่เลวร้ายที่สุด
ดีเบน Knoble
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.