我有兴趣在Vim for Python代码中启用代码折叠。我注意到了多种方法。
有没有人有一个首选的方法在Vim中进行Python代码折叠?即,
答案 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_ifold
plugin。
答案 4 :(得分:5)
我认为缩进折叠适用于python。我正在为vim-config python / django IDE创建一个多分支的git repo。叉开!
答案 5 :(得分:5)
答案 6 :(得分:4)
答案 7 :(得分:2)
Python源代码附带了一个vim语法插件以及一个自定义vimrc文件。查看python FAQ on vim
答案 8 :(得分:2)
对我来说,理想的折叠是折叠class
和def
块,缩进折叠对我来说太多了。我认为一个优雅的解决方案是使用像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
激活折叠。
答案 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>
因此,您可以z1
和z2
一点一点地缩进。
答案 10 :(得分: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