Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python多行字符串中断Vim';s缩进折叠_Python_Vim_Ide_Multiline_Folding - Fatal编程技术网

Python多行字符串中断Vim';s缩进折叠

Python多行字符串中断Vim';s缩进折叠,python,vim,ide,multiline,folding,Python,Vim,Ide,Multiline,Folding,Python的字符串文字并置使多行字符串更容易编写,也更美观,但是当我有四到五个缩进并且想要使用整行时(前导空格不重要),Vim的foldmethod=indent就崩溃了 例如: def getquote(): 打印“从绝对无用的函数中获取报价” 回归(“八十七年前,我们的祖先生下了,” 在这片大陆上,一个新的国家,孕育于自由之中,献身于 “关于“人人生而平等”的命题” 应折叠如下: def getquote(): +--4行:打印“从绝对无用的函数中获取报价”-- 但我得到的却是: de

Python的字符串文字并置使多行字符串更容易编写,也更美观,但是当我有四到五个缩进并且想要使用整行时(前导空格不重要),Vim的
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) "