使用Vim折叠进行Python代码的推荐方法是什么


112

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

有没有人喜欢在Vim中进行Python代码折叠的首选方法?即

  • 您是否有喜欢并喜欢的特定Vim插件?
  • 您使用手动折叠还是在标记中放置标记?
  • 还有其他推荐的方式在Vim中为Python进行代码折叠吗?

Answers:


117

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

set foldmethod=indent
nnoremap <space> za
vnoremap <space> zf

81
:set foldmethod =先缩进 我只是在谷歌上搜索,偶然发现了你的答案,非常好!:)
tmadsen

47
我的朋友也很喜欢set foldnestmax=2,这种方式可以折叠类的方法,但内部语句不是。
DenilsonSáMaia

9
我不确定为什么第二个映射在zf的答案中。如果使用缩进折叠,则不使用它。但是,如果您要进行手动折叠,则映射非常有意义。但是,za似乎是快速打开/关闭折叠的最佳方法。我还建议使用折叠导航(zk,zj)。
德里克·

vnoremap适用于手动映射。在您的ftplugin中,为Python添加set foldmethod = indent。然后,在您的.vimrc中,设置foldmethod = manual。现在,您可以使用空格键映射同时折叠Python和非Python
Lionel 2012年

26

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


展开后如何折叠?我找不到快捷方式!tnx
Moj 2013年

尝试了此语法文件,并且在突出显示时效果很好。但这对于冷折完全没有任何作用,当我使用'zM'时什么也没有发生,当我在班级中使用'za'时我得到了E490(未找到折痕)。怎么了?
Dani Gehtdichnixan 2014年

+1。第一次尝试时,python代码(类,方法)折叠对我来说效果很好。使用Walter的(stackoverflow.com/a/360634/605356)的答案将空格键映射到fold命令,但是(对我来说)该解决方案效果不佳。感谢@Tomas提供参考。
约翰尼·犹他州

@DaniGehtdichnixan,也许您需要:AnsiEsc-调查一下,我认为您会找到解决方案
serup 2016年

10

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

SimpylFold

请享用!


这最有效。我从来没有考虑过代码折叠,因为它从未引起任何麻烦。
iankit '16

@iankit有时我希望它也可以折叠iffor然后while块,不是吗?
iago-lito'正在考虑

嗯,我认为可能不是很有帮助。如果他折叠这些块,则在折叠状态下内容物不是很清楚。但是,对于方法和其他命名块,其名称说明了一切。我可以通过查看折叠块的名称来猜测折叠块在做什么。
iankit '16

@iankit我不知道..我想尝试。为什么不尝试?^ ^
iago-lito'正在考虑

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>




3

对我来说,理想的折叠方式是只折叠 classdef折叠,缩进式折叠对于我的口味而言实在太多了。我认为,一个优雅的解决方案是使用的语法系统,这样一个由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


1
我喜欢这个解决方案。但是,如果它们位于行首,则与'n fold classdefs 不匹配。由于我几乎看不懂该表达式,因此在尝试对其进行调整以匹配^def和时遇到了麻烦^class。这很好奇,尽管既然\s*应该对此进行很好的处理
。–


2

在您的.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被取消缩进少一点。


2

我真的很喜欢我为.vimrc编写的这个小vim脚本。它映射alt+1为折叠第一个python缩进级别(类定义和函数),alt+2折叠第二个python缩进级别(类方法)以及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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.