我对在Vim中为Python代码启用代码折叠很感兴趣。我注意到有多种方法可以实现。
有人有偏好的方法来在Vim中进行Python代码折叠吗?例如,
- 你有使用和喜欢的特定Vim插件吗? - 你使用手动折叠还是在注释中放置标记? - 有其他推荐的在Vim中进行Python代码折叠的方法吗?
有人有偏好的方法来在Vim中进行Python代码折叠吗?例如,
- 你有使用和喜欢的特定Vim插件吗? - 你使用手动折叠还是在注释中放置标记? - 有其他推荐的在Vim中进行Python代码折叠的方法吗?
就我个人而言,我无法说服自己在代码中添加标记。我已经习惯了使用缩进折叠,并且非常高效。再加上我的空格键映射(见下文)用于打开/关闭折叠以及zR和zM命令,我感到非常舒适。对于Python来说非常完美!
set foldmethod=indent
nnoremap <space> za
vnoremap <space> zf
这将空格键映射为在正常模式下打开/关闭当前缩进折叠。它还将空格键映射为在可视模式下创建手动折叠。但是,如果foldmethod设置为indent,则此功能无法使用,其目的成为一个谜。
我使用this语法文件来编写Python。它将折叠方法设置为语法,并折叠所有类和函数,但不包括其他内容。
if
、for
和while
块,你不觉得吗? - iago-litoPython非常适合根据缩进进行折叠,但是对于编写自己的代码,我使用标记,因为它们可以将文档压缩到您想要的方式,并且可以作为目录的一种形式。在查看别人的代码时,我在我的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>
我非常喜欢python_ifold
插件。
.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
逐渐取消缩进。
class
和def
块,缩进折叠对我来说太多了。我认为一种优雅的解决方案是使用像Tomas提到的这个这个语法系统。然而,这个语法系统是用来替代原始语法文件的,它可能比原始语法文件还要老(例如,该脚本没有提到Python 3语法)。python.vim
的文件放在~/.vim/syntax
文件夹中,其中只包含重要的行(从上面的脚本中获取)。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
来激活折叠即可。class
和def
。由于我几乎无法阅读表达式,因此我很难调整它以匹配^def
和^class
。这很奇怪,因为\s*
应该可以很好地处理这个问题。 - iago-litoPython源代码自带vim语法插件和自定义的vimrc文件。请查看关于vim的Python FAQ
set foldnestmax=2
,这样可以折叠类的方法,但是不会折叠内部语句。 - Denilson Sá Maia