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

时间:2008-12-10 22:10:46

标签: python vim folding

我有兴趣在Vim for Python代码中启用代码折叠。我注意到了多种方法。

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

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

11 个答案:

答案 0 :(得分:102)

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

  

nnoremap <space> za

     

vnoremap <space> zf

答案 1 :(得分:23)

我为Python使用this语法文件。它将折叠方法设置为语法并折叠所有类和函数,但没有别的。

答案 2 :(得分:6)

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 :(得分:5)

我认为缩进折叠适用于python。我正在为vim-config python / django IDE创建一个多分支的git repo。叉开!

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

答案 4 :(得分:5)

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

SimpylFold

享受!

答案 5 :(得分:5)

我非常喜欢python_ifold plugin

答案 6 :(得分:4)

答案 7 :(得分:2)

Python源代码附带了一个vim语法插件以及一个自定义vimrc文件。查看python FAQ on vim

答案 8 :(得分: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

答案 9 :(得分: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一点一点地缩进。

答案 10 :(得分:2)

对我来说,理想的折叠是折叠classdef块,缩进折叠对我来说太多了。我认为一个优雅的解决方案是使用像Tomas提到的one这样的语法系统。但是,这个意味着要替换原始语法文件,它可能比原始文件更旧(即该脚本没有提到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激活折叠。