구문 foldmethod
은 훌륭하지만 때로는 주석을 소스 파일에 접고 싶습니다.
주석의 구문 접기는 다음과 같은 C 스타일 주석에만 작동합니다.
/*
...
*/
그러나 다음과 같은 주석 상용구에는 해당되지 않습니다.
//
//
// ...
//
또는 C와 유사한 언어로 된 주석 블록의 경우에도 다음과 같습니다.
#
#
# ...
#
vim으로 어떻게 구성 할 수 있습니까?
구문 foldmethod
은 훌륭하지만 때로는 주석을 소스 파일에 접고 싶습니다.
주석의 구문 접기는 다음과 같은 C 스타일 주석에만 작동합니다.
/*
...
*/
그러나 다음과 같은 주석 상용구에는 해당되지 않습니다.
//
//
// ...
//
또는 C와 유사한 언어로 된 주석 블록의 경우에도 다음과 같습니다.
#
#
# ...
#
vim으로 어떻게 구성 할 수 있습니까?
답변:
주석 만 접는 것은 다음을 사용하여 매우 쉽습니다 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
나는 들여 쓰기로 접기를 좋아하지만 접기에 주석을 포함시킵니다 (각 주석은 이전 줄과 동일한 수준의 접기를 얻습니다).
불행히도 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")') )
줄의 첫 문자가 구문의 주석으로 간주되는지 확인합니다. 따라서 들여 쓰기와 구문 폴딩을 가장 고급 폴딩 인 표현식과 병합하는 좋은 방법입니다.
결과의 모양에 따라 "접기 텍스트"를 설정할 수도 있습니다.
주석 처리 된 블록을 시각적으로 선택한 vac
다음 수동 접기를 만들 수 있습니다 zf
.
주석 텍스트 개체는 표준 vim 텍스트 개체 집합에 대한 언어 확장 일 수 있습니다. Go 구문으로 테스트했습니다.
ac
내장되지 않습니다. 그러나 tpope의 논평 gc
은 텍스트 객체입니다. 더 나은 솔루션은 zfac
, zfgc
또는 zfip
최악입니다