代码之家  ›  专栏  ›  技术社区  ›  reckoner

如何在VIM的python源代码中折叠长docstring?

  •  9
  • reckoner  · 技术社区  · 14 年前

    有人知道一个方法,或者一个插件,可以 跨多页的代码,因此保持分页很麻烦 通过他们。另一个棘手的部分是嵌入了python 测试docstring中的代码,这样可能会导致解析它们 困难。请注意,我只需要自动折叠 整个的

    6 回复  |  直到 6 年前
        1
  •  8
  •   too much php    14 年前

    :sp $VIMRUNTIME/syntax/python.vim )并找到三重引号字符串的所有语法区域(搜索 ''' """ )并添加 fold foldmethod=syntax 对于python文件,应该折叠注释。

        2
  •  2
  •   nearlymonolith    14 年前

    zf/

    def foo():
        """[]
        Some long docstring
        that takes up many
        lines
        """
        pass
    

    请先查看edit2以获取更新的搜索字符串!

    zf/"""[ENTER] """

    我知道这不是自动化,但也许它会在这期间有所帮助,或者引导您走上自动化的正确道路。 请参阅edit2以获得更好的搜索功能,尽管我仍然不知道如何自动执行。

    编辑 :在推论中,您可以使用 /"""\_.\{-}""" ,尽管这也将返回docstring中的代码。要搜索后跟docstring的函数定义,可以使用 /def\_.\{-}"""\_.\{-}""" ,尽管这会破坏docstring中的def。

    编辑2 :实际上,更多地使用regex使我想到了这一点: /def.\{-}):\_s*"""\_.\{-}""" def 后跟任何字符,然后 ): 后跟换行符和/或空格后跟 """ """

        3
  •  1
  •   rdegges    14 年前

    在.vimrc中添加:

    " folding
    set foldmethod=indent
    

        4
  •  0
  •   Daenyth    14 年前

    你可以这样做 :set foldmethod=marker foldmarker=""",""" ,我想。我还没测试过,但应该可以。foldmarker的参数是开始和结束标记。

        5
  •  0
  •   Alec Thomas    11 年前

    很多年前,我写了一个vimscript插件来实现这一点,但一直没有发布它。我把它当作一个 gist ,但也粘贴了下面的源代码。我还复制了它的崇高文本功能 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
    
        6
  •  0
  •   Jacob Wang    10 年前

    我的解决方案是使用 SimpylFold vimrc 文件:

    autocmd FileType python setlocal foldlevel=2
    

    当你打开一个python文件时,默认情况下所有的docstring都会折叠起来,这真是太棒了。