주석을 접는 방법?


16

구문 foldmethod은 훌륭하지만 때로는 주석을 소스 파일에 접고 싶습니다.

주석의 구문 접기는 다음과 같은 C 스타일 주석에만 작동합니다.

/*
 ...
 */

그러나 다음과 같은 주석 상용구에는 해당되지 않습니다.

//
//
// ...
//

또는 C와 유사한 언어로 된 주석 블록의 경우에도 다음과 같습니다.

#
#
# ...
#

vim으로 어떻게 구성 할 수 있습니까?


구문 폴딩 주석 폴딩을 사용 하시겠습니까? 아니면 주석 접습니까?
Martin Tournoij 2016 년

@Carpetsmoker, 구문 접기 + 주석 접기는 '댓글을 제외한 모든 접기를여십시오'라고 말할 수 있다면 괜찮을 것입니다. 그렇지 않으면 구문 접기없이 주석 접기도 좋습니다.
maxschlepzig 2018 년

답변:


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 키워드는 한 줄 주석에 대해서만 작동합니다. 그래서 vimrc에서 expr로 접습니다.

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

들여 쓰기를 기준으로 foldlevel 기준을 반환합니다.

그리고 다른 하나 :

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

줄의 첫 문자가 구문의 주석으로 간주되는지 확인합니다. 따라서 들여 쓰기와 구문 폴딩을 가장 고급 폴딩 인 표현식과 병합하는 좋은 방법입니다.

결과의 모양에 따라 "접기 텍스트"를 설정할 수도 있습니다.


0

주석 처리 된 블록을 시각적으로 선택한 vac다음 수동 접기를 만들 수 있습니다 zf.

주석 텍스트 개체는 표준 vim 텍스트 개체 집합에 대한 언어 확장 일 수 있습니다. Go 구문으로 테스트했습니다.


1
실제로, ac내장되지 않습니다. 그러나 tpope의 논평 gc은 텍스트 객체입니다. 더 나은 솔루션은 zfac, zfgc또는 zfip최악입니다
D. Ben Knoble
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.