当前位置:K88软件开发文章中心编程工具Vim → 文章内容

Vimscript 高级折叠

减小字体 增大字体 作者:佚名  来源:网上搜集  发布时间:2019-1-24 10:54:14

b c第一种情况处理行"b":a ? b 1 c ?行"c"为最后一行,有着缩进等级1。由于我们的辅助函数,next_indent将设为0。 这匹配if语句的第二部分,所以foldlevel设为当前缩进等级,也即是1。a ? b 1 c 1结果如我们所愿,"b"和"c"折叠到一块去了。更高的缩进等级现在还剩下最后一个if语句:if next_indent == this_indent return this_indentelseif next_indent < this_indent return this_indentelseif next_indent > this_indent return '>' . next_indentendif而我们的例子现在是:a 0b ? c 1 d 1e 0只剩下行"b"我们还不知道它的foldlevel,因为:"b"的缩进等级为0。"c"的缩进等级为1。1既不等于0,又不小于0。最后一种情况检查下一行的缩进等级是否_大于_当前行。这种情况下Vim的indent折叠并不理想,也是为什么我们一开始打算写自定义的折叠代码的原因!最后的情况表示,当下一行的缩进比当前行多,它将返回一个以>开头和_下一行_的缩进等级构成的字符串。 这是什么意思呢?从折叠表达式中返回的,类似>1的字符串表示Vim的特殊foldlevel中的一种。 它告诉Vim当前行需要_展开_一个给定level的折叠。在这个简单的例子中,我们可以简单返回表示缩进等级的数字,但我们很快将看到为什么要这么做。这种情况下"b"将展开level1的折叠,使我们的例子变成这样:a 0b >1 c 1 d 1e 0这就是我们想要的!万岁!复习如果你一步步做到了这里,你应该为自己感到骄傲。即使像这样的简单折叠代码,也会是令人绞尽脑汁的。在我们结束之前,让我们重温最初的factorial.pn代码,看看我们的折叠表达式是怎么处理每一行的foldlevel的。重新把factorial.pn代码列在这里:factorial = (n): total = 1 n to 1 (i): # Multiply the running total. total *= i. total.10 times (i): i string print '! is: ' print factorial (i) string print "\n" print.首先,所有的空行的foldlevel都将设为undefined:factorial = (n): total = 1 n to 1 (i): # Multiply the running total. total *= i. total. undefined10 times (i): i string print '! is: ' print factorial (i) string print "\n" print.所有折叠等级跟下一行的_相等_的行,它们的foldlevel等于折叠等级:factorial = (n): total = 1 1 n to 1 (i): # Multiply the running total. 2 total *= i. total. undefined10 times (i): i string print 1 '! is: ' print 1 factorial (i) string print 1 "\n" print.在下一行的缩进比当前行_更少_的情况下,也是同样的处理:factorial = (n): total = 1 1 n to 1 (i): # Multiply the running total. 2 total *= i. 2 total. 1 undefined10 times (i): i string print 1 '! is: ' print 1 factorial (i) string print 1 "\n" print. 1最后的情况是下一行的缩进比当前行更多。如果这样,那就设当前行的折叠等级为展开下一行的折叠:factorial = (n): >1 total = 1 1 n to 1 (i): >2 # Multiply the running total. 2 total *= i. 2 total. 1 undefined10 times (i): >1 i string print 1 '! is: ' print 1 factorial (i) string print 1 "\n" print. 1现在我们已经得到了文件中每一行的foldlevel。剩下的就是由Vim来解决未定义(undefined)的行。不久前我说过undefined的行将选择相邻行中较小的那个foldlevel。Vim手册是这么讲的,但不是十分地确切。 如果真是这样的,我们的文件中的空行的foldlevel为1,因为它相邻两行的foldlevel都为1。事实上,空行的foldlevel将被设定成0!这就是为什么我们不直接设置10 times(i):的foldlevel为1。我们告诉Vim该行_展开_一个level1的折叠。 Vim能够意识到这意味着undefined的行应该设置成0而不是1。这样做背后的理由也许深埋在Vim的源码里。 通常Vim在处理undefined行时,对待特殊的foldlevel的行为都是很聪明的,所以你总能如愿以偿。一旦Vim处理完undefined行,它会得到一个对每一行的折叠情况的完整描述,看上去像这样:factorial = (n): 1 total = 1 1 n to 1 (i): 2 # Multiply the running total. 2 total *= i. 2 total. 1 010 times (i): 1 i string print 1 '! is: ' print 1 factorial (i) string print 1 "\n" print. 1这就是了,我们完成啦!重新加载折叠代码,在factorial.pn中玩玩我们神奇的折叠功能吧!练习阅读:help foldexpr.阅读:help fold-expr。注意你的表达式可以返回的所有特殊字符串。阅读:help getline。阅读:help indent()。阅读:help line()。想想为什么我们用.连接>和我们折叠函数给出的数字。如果我们使用的是+会怎样?我们在全局空间中定义了辅助函数,但这不是好的做法。把它改到脚本本地的命名空间中。放下本书,出去玩一下,让你的大脑从本章中清醒清醒。

上一页  [1] [2] [3] 


Vimscript 高级折叠