是否有人知道某种方法或插件 在Python中自动折叠长文档字符串?我有自己的文档字符串 跨越多个页面的代码,因此保持分页很麻烦 通过他们。另一个棘手的部分是嵌入式python 测试文档字符串中的代码,以便解析它们 难。请注意,我只需要自动折叠整个 docstring,无论它是什么。
答案 0 :(得分:8)
这有点脏,但您可以浏览python语法文件(:sp $VIMRUNTIME/syntax/python.vim
)并查找三重引号字符串的所有语法区域(搜索'''
和{{ 1}})并将"""
关键字添加到这些语句的末尾。然后只为python文件设置fold
,评论应该折叠。
答案 1 :(得分:2)
我不确定插件或自动化,但如果您输入zf/
,则可以搜索某些内容,然后它会折叠到下一个实例。所以在如下文档中(其中[]是光标):
def foo():
"""[]
Some long docstring
that takes up many
lines
"""
pass
首先查看edit2以获取更新的搜索字符串!
如果您使用命令zf/"""[ENTER]
,它应该折叠从当前行(文档字符串的开头)到下一个"""
出现的所有内容,这应该是文档字符串的结尾。
我知道这不是自动化,但也许它会在过渡期间提供帮助,或者引导您走上自动化的道路。 请参阅edit2以获得更好的搜索功能,但我仍然不知道如何自动化。
希望这有帮助。
编辑:在推论中,您可以使用/"""\_.\{-}"""
搜索任何文档字符串,但这也会返回文档字符串中的代码。要搜索函数定义后跟文档字符串,可以使用/def\_.\{-}"""\_.\{-}"""
,尽管这会破坏文档字符串中的def。
Edit2 :实际上,有些人正在使用正则表达式引导我:/def.\{-}):\_s*"""\_.\{-}"""
应该找到任何函数后跟docstring。它搜索def
后跟任何字符,然后搜索):
后跟换行符和/或空格,后跟"""
,后跟任意数量的行,而不是下一个"""
,但是始终确保第二个三重报价紧跟在第一个之后。
答案 2 :(得分:1)
在.vimrc中添加:
" folding
set foldmethod=indent
这将在每个缩进处自动折叠,在python中,它会转换为docstrings。它的工作非常好。试试看。上面的答案是正确的,但需要一堆击键(等等!)
答案 3 :(得分:0)
我认为您可以使用:set foldmethod=marker foldmarker=""","""
执行此操作。我没有测试过,但是应该这样做。 foldmarker的参数是开始和结束标记。
答案 4 :(得分:0)
多年前我写了一个vimscript插件来完成这个,但从来没有出版过它。我把它作为gist提出来,但也粘贴了下面的来源。我还复制了Sublime Text here的功能。
"
" Fold multi-line Python comments into one line.
"
" Also maps the "-" key to toggle expansion and <C-f> to toggle all folding.
"
setlocal foldmethod=syntax
setlocal foldtext=FoldText()
setlocal fillchars=
map <buffer> - za
map <buffer> <C-f> :call ToggleFold()<CR>
let b:folded = 1
hi Folded gui=bold cterm=bold guifg=cyan ctermfg=cyan guibg=NONE ctermbg=NONE
function! ToggleFold()
if b:folded == 0
exec "normal! zM"
let b:folded = 1
else
exec "normal! zR"
let b:folded = 0
endif
endfunction
function! s:Strip(string)
return substitute(a:string, '^[[:space:][:return:][:cntrl:]]\+\|[[:space:][:return:][:cntrl:]]\+$', '', '')
endfunction
" Extract the first line of a multi-line comment to use as the fold snippet
function! FoldText()
let l:snippet = getline(v:foldstart)
if len(s:Strip(l:snippet)) == 3
let l:snippet = strpart(l:snippet, 1) . s:Strip(getline(v:foldstart + 1))
endif
return '+' . l:snippet . ' ...'
endfunction
答案 5 :(得分:0)
我的解决方案涉及使用SimpylFold。在使用Vundle安装它之后,我将其放在我的vimrc
文件中:
autocmd FileType python setlocal foldlevel=2
当你打开python文件时,默认情况下折叠所有文档字符串,这非常棒。