122

我有兴趣在 Vim 中为 Python 代码启用代码折叠。我注意到有多种方法可以做到这一点。

有没有人有首选的方式在 Vim 中进行 Python 代码折叠?IE,

  • 你有什么特别喜欢的 Vim 插件吗?
  • 您使用手动折叠还是在评论中放置标记?
  • 在 Vim 中为 Python 进行代码折叠的任何其他推荐方法?
4

12 回答 12

135

就我个人而言,我无法说服自己用标记乱扔我的代码。我已经非常习惯(并且高效)使用缩进折叠。连同我将空格键(见下文)映射到打开/关闭折叠以及 zR 和 zM 命令,我就在家里。非常适合 Python!

set foldmethod=indent
nnoremap <space> za
vnoremap <space> zf
于 2008-12-11T19:47:43.767 回答
26

将此语法文件用于 Python。它将折叠方法设置为语法并折叠所有类和函数,但仅此而已。

于 2008-12-12T00:32:01.930 回答
10

另一个用于折叠 Python 代码的插件。相当简单,处理文档字符串,在 GitHub 上:

简单折叠

享受!

于 2015-11-26T13:51:00.467 回答
7

Python 非常适合折叠缩进,有点用于编写我自己的代码我使用标记,因为它们可以按照您想要的方式压缩文档,并且可以用作一种目录。当我查看别人的代码时,我的 vimrc 中有这个可以在两者之间切换。

#Toggle fold methods \fo
let g:FoldMethod = 0
map <leader>fo :call ToggleFold()<cr>
fun! ToggleFold()
    if g:FoldMethod == 0
        exe 'set foldmethod=indent'
        let g:FoldMethod = 1
    else
        exe 'set foldmethod=marker'
        let g:FoldMethod = 0
    endif
endfun
#Add markers (trigger on class Foo line)
nnoremap ,f2 ^wywO#<c-r>0 {{{2<esc>
nnoremap ,f3 ^wywO#<c-r>0 {{{3<esc> 
nnoremap ,f4 ^wywO#<c-r>0 {{{4<esc>
nnoremap ,f1 ^wywO#<c-r>0 {{{1<esc>
于 2008-12-10T22:26:19.487 回答
5

我真的很喜欢这个python_ifold插件

于 2008-12-10T22:29:04.240 回答
5

我认为缩进折叠对 python 来说很好。我正在为 vim-config python/django IDE 的想法制作一个多分支的 git 存储库。叉开!

http://github.com/skyl/vim-config-python-ide

于 2009-12-08T18:32:36.403 回答
4

试试这个插件:

http://vim.sourceforge.net/scripts/script.php?script_id=515

于 2008-12-11T07:23:05.643 回答
4

在你的.vimrc

set foldmethod=indent
set shiftwidth=4

然后zM屏蔽所有zR以扩展所有。我还补充说:

nnoremap <space> za
vnoremap <space> zf
map z1  :set foldlevel=0<CR><Esc>
map z2  :set foldlevel=1<CR><Esc>
map z3  :set foldlevel=2<CR><Esc>
map z4  :set foldlevel=3<CR><Esc>
map z5  :set foldlevel=4<CR><Esc>
map z6  :set foldlevel=5<CR><Esc>
map z7  :set foldlevel=6<CR><Esc>
map z8  :set foldlevel=7<CR><Esc>
map z9  :set foldlevel=8<CR><Esc>

所以你可以一点一点地取消缩进z1z2

于 2020-01-03T03:46:37.597 回答
3

对我来说,理想的折叠是只折叠classanddef块,缩进折叠对我来说太过分了。我认为一种优雅的解决方案是使用 Tomas 提到的语法系统。然而,这个是为了替换原来的语法文件,它可能会比原来的更旧(即该脚本没有提到 Python 3 语法)。

我的解决方案是在~/.vim/syntax文件夹中放置一个仅以重要行命名的文件python.vim(取自上述脚本):

syn match   pythonDefStatement  /^\s*\%(def\|class\)/
       \ nextgroup=pythonFunction skipwhite
syn region  pythonFunctionFold  start="^\z(\s*\)\%(def\|class\)\>"
       \ end="\ze\%(\s*\n\)\+\%(\z1\s\)\@!." fold transparent

hi link pythonDefStatement Statement

然后简单地用 激活折叠:set foldmethod=syntax

于 2014-01-14T11:09:43.493 回答
2

Python 源代码带有一个 vim 语法插件以及一个自定义 vimrc 文件。查看vim 上的 python 常见问题解答

于 2009-01-06T23:24:48.980 回答
2

我真的很喜欢我为 .vimrc 编写的这个小 vim 脚本。它映射alt+1到折叠第一个 python 缩进级别(类定义和函数),alt+2折叠第二级(类方法),并alt+0展开所有内容。它确保它只折叠一个级别并且不折叠任何嵌套的子级别。您仍然可以使用za来切换当前块的折叠。请注意,在 中^[0,这^[alt我的终端。对vim脚本没有太多经验,所以请随意对功能提出建议:)

" Python folding
nnoremap ^[0 zR<CR>
nnoremap ^[1 :call Fold(0)<CR>
nnoremap ^[2 :call Fold(1)<CR>
function Fold(level)
    :let b:max = a:level + 1
    :set foldmethod=indent
    :execute 'set foldnestmax='.b:max
    :execute 'set foldlevel='.a:level
endfunction
于 2020-06-18T14:55:51.147 回答
0

根据@Genma 的回答,我将以下语法规则粘合在一起,只需将其添加为.vim/after/syntax/python.vim

syn keyword pythonStatement class def
syn match pythonFunction "\h\w*" containedin=pythonFold
syn region  pythonFold  fold transparent
      \ start = "\(^\z(\s*\)\v%(def|class|if|elif|else|for|while|try|except|finally|with)>)@<="
      \ end   = "\v\ze%(\s*\n)+%(\z1\s)@!."

syn region pythonCurlyBrace start="{" end="}" fold transparent
syn region pythonSquareBrace start="\[" end="\]" fold transparent
于 2021-12-31T15:43:37.213 回答