为 Python 代码使用 Vim 折叠的推荐方法是啥

Posted

技术标签:

【中文标题】为 Python 代码使用 Vim 折叠的推荐方法是啥【英文标题】:What is the recommended way to use Vim folding for Python code为 Python 代码使用 Vim 折叠的推荐方法是什么 【发布时间】:2010-09-26 08:18:31 【问题描述】:

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

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

您有自己使用和喜欢的特定 Vim 插件吗? 您使用手动折叠还是在 cmets 中放置标记? 在 Vim 中为 Python 进行代码折叠的任何其他推荐方法?

【问题讨论】:

【参考方案1】:

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>

【讨论】:

【参考方案2】:

我真的很喜欢python_ifold plugin。

【讨论】:

不幸的是,这个插件使用的处理器时间比我希望的要多(即使是 a 版本),因为我想保持我的 vim 速度。还有其他建议吗? 这个答案确实需要说明。【参考方案3】:

试试这个插件:

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

【讨论】:

【参考方案4】:

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

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

【讨论】:

:先设置 foldmethod=indent。我只是在谷歌上搜索这个,偶然发现了你的答案,非常好! :) 我的朋友也喜欢set foldnestmax=2,这样类的方法是折叠的,但内部语句没有。 我不确定为什么第二个映射出现在 zf 的这个答案中。如果正在使用缩进折叠,则不使用它。但是,如果您进行手动折叠,则映射非常有意义。然而,za 似乎是快速打开/关闭折叠的最佳方式。我还推荐使用折叠导航(zk,zj)。 vnoremap 适合手动映射。在您的 ftplugin 中,为 Python 添加 set foldmethod=indent。然后,在你的 .vimrc 中,设置 foldmethod=manual。现在,您可以使用空格键映射在 Python 和非 Python 中折叠【参考方案5】:

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

【讨论】:

展开后如何折叠?我找不到捷径! tnx 试过这个语法文件,它在突出显示方面工作得相当好。但它对冷折叠完全没有任何作用,当我使用“zM”时没有任何反应,当我在课堂上使用“za”时,我得到了 E490(未找到折叠)。出了什么问题? +1。第一次尝试,python 代码(类,方法)折叠对我来说非常有用。使用 Walter (***.com/a/360634/605356) 的答案来映射空格键以折叠命令,但该解决方案(对我而言)不如这个解决方案好用。感谢@Tomas 的参考。 @DaniGehtdichnixan,也许你需要 :AnsiEsc -- 研究一下,我想你会找到解决方案【参考方案6】:

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

【讨论】:

这个语法文件也不包含折叠信息。所以你不能使用这个语法折叠的语法文件。【参考方案7】:

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

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

【讨论】:

【参考方案8】:

对我来说,理想的折叠是只折叠 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 激活折叠即可。

【讨论】:

我喜欢这个解决方案。但如果它们位于行首,则它不匹配 'n fold classes 和 defs。因为我几乎看不懂这个表达式,所以我很难调整它以匹配^def^class。这很奇怪,因为\s* 应该可以很好地处理这个问题..【参考方案9】:

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

SimpylFold

享受吧!

【讨论】:

这个效果最好。我根本不再考虑代码折叠,因为它从来没有引起任何头痛。 @iankit 我有时希望它也能折叠ifforwhile 块,不是吗? 嗯,我认为这可能不是很有帮助。如果他折叠这些块,在折叠状态下内容是什么就不是很清楚了。但是,对于方法和其他命名块,名称说明了一切。我可以通过查看它的名称来猜测折叠块在做什么。 @iankit 我不知道.. 我想试试。为什么不trying? ^ ^【参考方案10】:

在你的.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 一点一点地取消缩进。

【讨论】:

【参考方案11】:

我真的很喜欢我为 .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

【讨论】:

在 Mac 上使用 alt 键:***.com/questions/7501092/can-i-map-alt-key-in-vim【参考方案12】:

基于the answer by @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

【讨论】:

以上是关于为 Python 代码使用 Vim 折叠的推荐方法是啥的主要内容,如果未能解决你的问题,请参考以下文章

vim设置为indent折叠以后,每次打开文件时代码处于折叠状态,能改变吗?

如何使用 vim-latex 在 vi​​m 中禁用代码折叠?

VIM 代码折叠

新的vim自带markdown插件,请问markdown怎么折叠文本,只显示标

vim 配置文件 ,高亮+自动缩进+行号+折叠+优化

vim 配置文件 ,高亮+自动缩进+行号+折叠+优化