Python多行字符串中断Vim';s缩进折叠
Python的字符串文字并置使多行字符串更容易编写,也更美观,但是当我有四到五个缩进并且想要使用整行时(前导空格不重要),Vim的Python多行字符串中断Vim';s缩进折叠,python,vim,ide,multiline,folding,Python,Vim,Ide,Multiline,Folding,Python的字符串文字并置使多行字符串更容易编写,也更美观,但是当我有四到五个缩进并且想要使用整行时(前导空格不重要),Vim的foldmethod=indent就崩溃了 例如: def getquote(): 打印“从绝对无用的函数中获取报价” 回归(“八十七年前,我们的祖先生下了,” 在这片大陆上,一个新的国家,孕育于自由之中,献身于 “关于“人人生而平等”的命题” 应折叠如下: def getquote(): +--4行:打印“从绝对无用的函数中获取报价”-- 但我得到的却是: de
foldmethod=indent
就崩溃了
例如:
def getquote():
打印“从绝对无用的函数中获取报价”
回归(“八十七年前,我们的祖先生下了,”
在这片大陆上,一个新的国家,孕育于自由之中,献身于
“关于“人人生而平等”的命题”
应折叠如下:
def getquote():
+--4行:打印“从绝对无用的函数中获取报价”--
但我得到的却是:
def getquote():
+--2行:打印“从绝对无用的函数中获取报价”--
在这片大陆上,一个新的国家,孕育于自由之中,献身于
“关于“人人生而平等”的命题”
我试着设置foldignore=\”
,但没有效果。Vim的help foldignore
提供了关于这个主题的如下说明:
仅当“foldmethod”为“缩进”时使用。以开头的行
“foldignore”中的角色将从周围环境获得折叠级别
行。在检查此字符之前跳过空白
是否有一些明显的地方我遗漏了,或者我必须求助于foldmethod=expr
,将折叠级别基于缩进,除了我自己的角盒
编辑:我至少取得了一些进展;事实证明,如果我在字符串后面添加一个非空行,并使用set fdm=indent
“刷新”缩进,那么块就会按预期折叠。即使是空注释(#
)也足够了
是否有明显的地方我遗漏了,或者我必须求助于foldmethod=expr,将foldlevel基于缩进,除了我自己的角盒
简短回答:你不能用foldmethod=indent
来做这件事,但我发现你可以用foldmethod=expr
来做,所以不需要重新设计轮子。请看详细答案
长答案
只是简单回顾一下foldmethod=indent
的工作原理
- 从页面边缘查找带空格的文本移位
shiftwidth
- 插入新的
foldlevel
- 减少缩进可以降低折叠级别
shiftwidth
的内容最终都会被破坏,除非您像以前那样对其进行破解
我查看了几种不同的.vimrc
配置,然后找到了一些可行的方法。要获得比foldmethod=indent
更干净的解决方案,请将foldmethod=expr
与下面的~/.vimrc
一起使用。我在
作为测试,我在您的示例中构建了更多的案例
class testclass(对象):
定义初始化(自):
self.testit=None
定义报告(自我):
返回“鳄梨酱”
def foobarme():
断言错误
返回42
def getquote():
打印“从绝对无用的函数中获取报价”
回归(“八十七年前,我们的祖先生下了,”
在这片大陆上,一个新的国家,孕育于自由之中,献身于
“关于“人人生而平等”的命题”
在my~/.vimrc
的底部使用可产生:
当我点击zR
展开时:
仅供参考,我使用Dmitry Vasiliev在~/.vim/syntax/python.vim
中的代码来突出显示python语法
我在下面复制了jneb的vim脚本,以防bitbucket回购消失
python代码的折叠例程,3.2版 “资料来源:http://www.vim.org/scripts/script.php?script_id=2527 “最后更改:2009年2月25日 作者:Jurjen Bos Bug修复和有用的评论:Grissiom、David Froger、Andrew McNabb “原则: “-def/class开始折叠 “缩进小于先前def/class的行结束折叠 “空行和注释行链接到上一个折叠 “def/class外部的注释行从不折叠 “def/class外的其他管路作为一组折叠在一起 “有关算法,请参见脚本底部 “-或者,您可以在折叠之间获得空行,请参见(***) “-另一个选项是忽略非python文件,请参见(**) “-您还可以修改def/等级检查, “允许多行定义和类定义请参见(*) “vim 7用户注意: “Vim 6行号总是有8列,而Vim 7有一个numberwidth变量 “如果您有vim 7,您可以将下面的8更改为&numberwidth, “只有当您计划使用超过8列(即从不)时,这才真正有用。” “请注意,受虐狂试图阅读以下内容: “我想保持函数的简短,所以我替换了 “如果条件 “声明 ”“是的 “如果条件|语句 “无论我在哪里发现它有用 " (*) “类定义应该位于同一行的冒号上。 函数定义*不*需要冒号,以允许多行定义。 “如果您不同意,请使用“^\s*\(class\s.*:\\124; def\s\)模式代替” “要强制执行:对于defs:'^\s*\(类\|def\)\s.*” “你必须在两个地方这样做。 设s:defpat='^\s*\(@\\\class\s.*:\\\\def\s\)' “(**)忽略非python文件 “注释掉,因为Vim无法识别某些python文件 “if&filetype!='python' “完了 “endif setLocalFoldMethod=expr setlocal foldexpr=GetPythonFold(v:lnum) setlocal foldtext=PythonFoldText() 函数!PythonFoldText() 设fs=v:foldstart 而getline(fs)=~'^\s*@'|让fs=nextnonblank(fs+1) 循环结束 let line=getline(fs) 设nnum=nextnonblank(fs+1) 设nextline=getline(nnum) "