如何在VIM中的python源代码中折叠长文档字符串?

时间:2010-06-22 14:51:58

标签: python vim

是否有人知道某种方法或插件 在Python中自动折叠长文档字符串?我有自己的文档字符串 跨越多个页面的代码,因此保持分页很麻烦 通过他们。另一个棘手的部分是嵌入式python 测试文档字符串中的代码,以便解析它们 难。请注意,我只需要自动折叠整个 docstring,无论它是什么。

6 个答案:

答案 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文件时,默认情况下折叠所有文档字符串,这非常棒。