Jackbreak

  1. 安装openssh
  2. 配置安全性
  • 更改root密码
  • 禁用root登陆
  • 增加新账号
  1. 解决cydia添加源闪退:

ssh登陆iphone,执行如下操作:

1
2
3
# ls /var/root/Library/
AddressBook  Caches  Cookies  Lockdown  Logs  Mail  Preferences  WebKit
# cp -r /User/Library/Keyboard/ /var/root/Library/
  1. 添加国内178源:

http://apt.178.com

感觉178源靠谱点。

  1. 安装软件
  • Zephyr。这个必装,上划退出这个功能太方便了! 不过和SBSettings冲突,要安装的化最好卸载SBSettings。

  • AppSync

  • OpenSSH

    默认密码alpine,最好修改。

必装软件:

  1. root登陆
1
$ ssh root@192.168.2.2

密码alpine .. code-block:: console

$ apt-get install sudo vim aptitude screen zsh

First Ios App

1月19日开始第一个ios开发程序。

在Xcode4.2下创建一个SingleView Application项目first

Device Family: iPhone Use Storyboard Use Automatic Reference Counting

进入first项目根目录,有两个目录first和first.xcodeproj。进入first目录。

查看文件:

1
2
3
4
$ cd first
$ ls
AppDelegate.h    ViewController.h en.lproj         first-Prefix.pch
AppDelegate.m    ViewController.m first-Info.plist main.m

Storyboard在这里:

1
2
$ ls en.lproj/
InfoPlist.strings         MainStoryboard.storyboard

Storyboard的层次结构:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
document
    dependencies
    scenes
        scene
            objects
                placeholder
                viewController
                    view
                        rect
                        autoresizingMask
                        subviews
                        color
                    connections
                        outlet
    classes(一开始木有)
    simulatedMetricsContainer

添加一个Label

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
-                        <subviews/>
+                        <subviews>
+                            <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Label" lineBre
+                                <rect key="frame" x="139" y="20" width="42" height="21"/>
+                                <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+                                <fontDescription key="fontDescription" type="system" pointSize="17"/>
+                                <color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
+                                <nil key="highlightedColor"/>
+                            </label>
+                        </subviews>
                         <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
                     </view>
                 </viewController>
             </objects>
         </scene>
     </scenes>
+    <classes>
+        <class className="ViewController" superclassName="UIViewController">
+            <source key="sourceIdentifier" type="project" relativePath="./Classes/ViewController.h"/>
+        </class>
+    </classes>

做了2件事:

  1. 在subviews里增加了label,设置了相关属性。
  2. 在document下,scenes后增加了classes元素,关联到了ViewController.h文件,来做以后的事件处理。

设置Outlet关联

修改了如下3个文件:

1
2
3
#       modified:   ViewController.h
#       modified:   ViewController.m
#       modified:   en.lproj/MainStoryboard.storyboard

先看Storyboard

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
--- a/first/en.lproj/MainStoryboard.storyboard
+++ b/first/en.lproj/MainStoryboard.storyboard
@@ -23,6 +23,9 @@
                         </subviews>
                         <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
                     </view>
+                    <connections>
+                        <outlet property="statusLabel" destination="qCc-nf-TgC" id="b2g-zn-NAy"/>
+                    </connections>
                 </viewController>
             </objects>
         </scene>
@@ -30,6 +33,9 @@
     <classes>
         <class className="ViewController" superclassName="UIViewController">
             <source key="sourceIdentifier" type="project" relativePath="./Classes/ViewController.h"/>
+            <relationships>
+                <relationship kind="outlet" name="statusLabel" candidateClass="UILabel"/>
+            </relationships>
         </class>
     </classes>

也做了2件事:

  1. 增加connections元素,设置outlet关联到前面的label:outlet.destination == label.id
  2. 增加relationships元素,添加子节点relationship,kind为outlet。

再看ViewController.h。增加了一行:

1
@property (strong, nonatomic) IBOutlet UILabel* statusLabel;

在ViewController类中对应增加statusLabel数据成员。

ViewController.m中增加了2行:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
--- a/first/ViewController.m
+++ b/first/ViewController.m
@@ -9,6 +9,7 @@
 #import "ViewController.h"

 @implementation ViewController
+@synthesize statusLabel;

 - (void)didReceiveMemoryWarning
 {
@@ -26,6 +27,7 @@

 - (void)viewDidUnload
 {
+    [self setStatusLabel:nil];
     [super viewDidUnload];
     // Release any retained subviews of the main view.
     // e.g. self.myOutlet = nil;

增加的@synthesize行表示自动增加对应数据成员的get和set成员函数。

viewDidUnload是结束程序时的操作,这里将label的内存空间释放。

添加button

添加button后,Storyboard中在subviews下增加了button元素。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
                            </label>
+                            <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment
+                                <rect key="frame" x="26" y="13" width="72" height="37"/>
+                                <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+                                <fontDescription key="fontDescription" type="boldSystem" pointSize="15"/>
+                                <state key="normal">
+                                    <color key="titleColor" red="0.19607843459999999" green="0.30980393290000002" blue="0.521568656000
+                                    <color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
+                                </state>
+                                <state key="highlighted">
+                                    <color key="titleColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
+                                </state>
+                            </button>
                         </subviews>

action关联

设置action关联后,ViewController类中添加了事件方法和具体实现。

Storyboard中,button元素下增加了connections元素。relationships节点下增加子节点relationship,kind为action。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
                             <state key="highlighted">
                                 <color key="titleColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
                             </state>
+                                <connections>
+                                    <action selector="greeting:" destination="2" eventType="touchUpInside" id="Ua1-dU-BsV"/>
+                                </connections>
                             </button>
                         </subviews>
                         <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
@@ -46,6 +49,7 @@
         <class className="ViewController" superclassName="UIViewController">
             <source key="sourceIdentifier" type="project" relativePath="./Classes/ViewController.h"/>
             <relationships>
+                <relationship kind="action" name="greeting:"/>
                 <relationship kind="outlet" name="statusLabel" candidateClass="UILabel"/>
             </relationships>
         </class>

AppDelegate.h

1
2
3
4
5
6
7
#import <UIKit/UIKit.h>

@interface BIDAppDelegate : UIResponder <UIApplicationDelegate>

@property (strong, nonatomic) UIWindow* window;

@end

AppDelegate.m

方法:

  • application:didFinishLaunchingWithOptions

    这是一个多重参数函数

  • applicationWillResignActive

表格使用

  1. 拖入表格,选中并关联到下面的 View Controller,关联上dataSource和Delegate。
  2. ViewController.h中类要实现UITableViewDataSource和UITableViewDelegate。
1
2
3
@interface MasterViewController : UITableViewController <UITableViewDelegate, UITableViewDataSource>

@property (strong, nonatomic) NSArray* listData;
  1. ViewController.m中增加如下函数:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@synthesize listData;

- (NSInteger)tableView:(UITableView* )tableView numberOfRowsInSection:(NSInteger)section {
    return [self.listData count];
}

- (UITableViewCell* )tableView:(UITableView* )tableView cellForRowAtIndexPath:(NSIndexPath* )indexPath {
    static NSString* SimpleTableIdentifier = @"SimpleTableIndentifier";

    UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:SimpleTableIdentifier];
    if( cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:SimpleTableIdentifier];
    }

    NSUInteger row = [indexPath row];
    cell.textLabel.text = [listData objectAtIndex:row];
    return cell;
}

多视图控制

注意segue的使用,一定要聚焦到特定的控件上,比如button,而不是它的父控件,否则无效。

Idevice

最近开始学习iOS开发,参照“果粉保修查询”做了一个。

果粉保修查询自从被Apple官方封禁以后就没见有更新了,在wifi下会闪退。

这个程序刚有雏形,还不完善,本着TDD的思想,在此放出,希望大家多提意见。

下载地址:http://code.google.com/p/amoblin/downloads/list

Jekyll restructuredText配置

jekyll很好用,可惜默认是用markdown的,而我习惯了restructuredText,幸好jekyll支持插件,而刚好有这么一个插件。

jekyll-rst项目:https://github.com/xdissent/jekyll-rst

安装jekyll-rst插件到jekyll(官方说明):

1
2
$ cd <jekyll-project-path>
$ git submodule add https://github.com/xdissent/jekyll-rst.git plugins/jekyll-rst

安装RbST:

1
$ gem install RbST

然后把rst文件放到_posts目录下,使用jekyll编译时就会把rst也转换成html了,文件名的格式和md文件名一样。

但发现一个问题,rst文件中有中文的话,生成html文件为空。没有中文的话就正常。初步判断是编码的问题。

看了看jekyll-rst的代码,发现jekyll-rst后台使用的是RbST,一个ruby包装的restructuredText转换程序,本质上还是使用自带的rst2html.py来转换。

单独使用RbST自带的rst2html.py转换,也没问题,奇怪!

再去RbST的给i他湖边主页转悠,看看Issue里有木有人遇到这种情况,可怜的2个Issue呀。第1个看着像,按照所说的,在transform.py中的 import sys 下面增加两句:

1
2
reload(sys)
sys.setdefaultencoding('utf-8')

用来重置python的编码方式为utf8,再执行jekyll,果然好了。

现在找到解决方法了,但不优雅。

这不是RbST的问题,而是python设置的问题。

查看pyhton的默认编码:

1
2
$ python -c "import sys;print sys.getdefaultencoding()"
ascii

果然不是utf8!这下好了,只要设置pyhton默认编码就行了。

可以在site-packages下创建一个文件sitecustomize.py,这个文件会在pyhton启动时加载。把上面的python脚本内容放入这个文件,搞定!

此文是使用jekyll-rst写的第一篇文章。

Jekyll

从GAE的micor-blog到SAE的WP,我以为找到了最终的站点,但jekyll来了,我又开始了迁徙。

安装jekyll

jekyll是用ruby开发的,首先需要安装ruby,安装ruby,最好用版本管理,其中之一是rvm。所以我们先安装rvm,然后,通过rvm安装ruby,然后安装jekyll这个gem包。

安装rvm

1
2
3
$ bash -s stable < <(curl -s https://raw.github.com/wayneeseguin/rvm/master/binscripts/rvm-installer)
$ echo '[[ -s "$HOME/.rvm/scripts/rvm" ]] && . "$HOME/.rvm/scripts/rvm" # Load RVM function' >> ~/.bash_profile
$ source ~/.bash_profile

安装ruby

1
2
$ rvm install 1.9.3
$ rvm use 1.9.3

通过gem安装jekyll

1
$ gem install jekyll

部署jekyll

现在算是安装好了jekyll“编译器”,可以用来编译markdown文件,生成html文件。jekyll的要求结构部署如下:

1
2
$ ls -F
_config.yml  _includes/   _layouts/    _posts/      _site/

jekyllbootstrap来快速创建:http://jekyllbootstrap.com/

安装Octopress

1
2
$ git clone https://github.com/imathis/octopress.git octopress
$ bundle install

花瓣网抓取图片脚本

最早关注的不是花瓣网,是topit.me,这个网站不错,格调很高雅。

后来听说了Pinterest,然后是国内的花瓣网。花瓣网上主题,分类比较明确,看了页面, 组织也整齐,于是写了个花瓣网的图片抓取脚本。

其中有一个小问题,就是抓取的专辑beauty页面中,由于它是下拉刷新加载页面的,使用 urlretrieve不能下载下来,只能借助外部的curl了。有高手能解决的,还请不吝赐教。

代码下载地址: https://gist.github.com/1956744

内容不多,直接贴下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#!/usr/bin/env python
# -*- coding: utf8 -*-
# author: amoblin <amoblin@163.com>

import sys, re, urllib2, os, urllib

beauty_url = "http://huaban.com/favorite/beauty/"
pin_re = '<a href="/pins/(.+?)/"'

def get_img_url(pin):
    pin_url = "http://huaban.com/pins/%s/" % pin
    img_url_re = '<img alt="采集图片" src="(.+?)"'
    pg = urllib2.urlopen(pin_url)
    content = pg.read()
    pg.close()
    img_url = re.findall(img_url_re, content)[0]
    return img_url

if __name__ == "__main__":
    if len(sys.argv) < 2:
        local_path = "./huaban"
    else:
        local_path = sys.argv[1]

    if not os.path.exists(local_path):
        try:
            os.makedirs(local_path)
        except e:
            print e
            sys.exit(1)

    print "pin images will saved to: %s" % local_path

    os.system("curl -s %s -o /tmp/huaban.html" % beauty_url)
    content = open("/tmp/huaban.html").read()

    pins = re.findall(pin_re, content)[1:]
    for pin in pins:
        img_url = get_img_url(pin)
        print "saving pin: %s" % pin
        urllib.urlretrieve(img_url, "%s/%s.jpeg" % (local_path, pin))

Ios

界面文件 后缀为.nib或.xib,4.2以后改为storyboard。

真机开发

钥匙串访问(keychain)中创建证书,用于程序签名:

钥匙串访问-> 证书助理 -> 创建证书:

名称:iPhone Developer 证书类型:代码签名

修改Xcode:

1
2
$ cd /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk
$ sudo vi SDKSettings.plist

将如下内容: .. code-block:: text

15 <key>CODE_SIGNING_REQUIRED</key> 16 <string>YES</string>

中YES改为NO。

1
$ cd /Developer/Platforms/iPhoneOS.platform/

将XCiPhoneOSCodeSignContext中的iPhoneOS删掉。

1
2
$ vi Info.plist
:1,$s/XCiPhoneOSCodeSignContext/XCCodeSignContext/g

二进制补丁

XCode 4.2中路径变了:

1
2
3
4
5
6
$ cd /Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/PrivatePlugIns/iPhoneOS\ Build\ System\ Support.xcplugin/Contents/MacOS
$ dd if=iPhoneOS\ Build\ System\ Support of=working bs=500 count=255
$ echo -n xc3x26x00x00 >> working
$ chmod 755 working
$ mv iPhoneOS\ Build\ System\ Support iPhoneOS\ Build\ System\ Support.orig
$ mv working iPhoneOS\ Build\ System\ Support

自定义生成后脚本

1
2
3
$ wget http://www.alexwhittemore.com/iphone/gen_entitlements.txt
$ mv gen_entitlements.txt gen_entitlements.py
$ chmod 755 gen_entitlements.py

修改工程设置

Add Build Phrase -> Add Run Script,输入以下内容:

1
2
3
4
5
export CODESIGN_ALLOCATE=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/codesign_allocate
if [ "${PLATFORM_NAME}" == "iphoneos" ]; then
/Developer/iphoneentitlements401/gen_entitlements.py "my.company.${PROJECT_NAME}" "${BUILT_PRODUCTS_DIR}/${WRAPPER_NAME}/${PROJECT_NAME}.xcent";
codesign -f -s "iPhone Developer" --entitlements "${BUILT_PRODUCTS_DIR}/${WRAPPER_NAME}/${PROJECT_NAME}.xcent" "${BUILT_PRODUCTS_DIR}/${WRAPPER_NAME}/"
fi

参考资料:

http://hi.baidu.com/jaywclove/blog/item/0782355562849cdab645ae14.html

iOS中Unix环境配置

软件源地址:/etc/apt/sources.list.d/

  1. 安装aptitude:
1
$ apt-get install aptitude
  1. 使用aptitude搜索软件包:
1
$ aptitude search vim

Linux/Unix用户必备工具:

1
$ sudo apt-get install less vim git python screen

通过命令行发短信:

1
$ sudo apt-get install sendsms

17_ios

界面文件 后缀为.nib或.xib,4.2以后改为storyboard。

真机开发

钥匙串访问(keychain)中创建证书,用于程序签名:

钥匙串访问-> 证书助理 -> 创建证书:

名称:iPhone Developer 证书类型:代码签名

修改Xcode下SDK配置:

XCode4.3以后Xcode作为独立应用程序,所有的文件都打包在Xcode里面,之前/Developer下的文件现在变为/Applications/Xcode.app/Contents/Developer/。

所以之前这样:

1
2
$ cd /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk
$ sudo vi SDKSettings.plist

现在为:

1
2
$ cd /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk
$ sudo vi SDKSettings.plist

将如下内容: .. code-block:: text

15 <key>CODE_SIGNING_REQUIRED</key> 16 <string>YES</string>

中YES改为NO。

1
$ cd /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/

将XCiPhoneOSCodeSignContext中的iPhoneOS删掉:

1
2
$ sudo vi Info.plist
:1,$s/XCiPhoneOSCodeSignContext/XCCodeSignContext/g

二进制补丁

XCode4.3中路径为:

1
$ cd /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/PrivatePlugIns/iPhoneOS\ Build\ System\ Support.xcplugin/Contents/MacOS

XCode 4.2中路径为:

1
$ cd /Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/PrivatePlugIns/iPhoneOS\ Build\ System\ Support.xcplugin/Contents/MacOS

然后:

1
2
3
4
5
6
$ sudo su
# dd if=iPhoneOS\ Build\ System\ Support of=working bs=500 count=255
# echo -n xc3x26x00x00 >> working
# chmod 755 working
# mv iPhoneOS\ Build\ System\ Support iPhoneOS\ Build\ System\ Support.orig
# mv working iPhoneOS\ Build\ System\ Support

自定义生成后脚本

1
2
3
4
5
$ mkdir /Applications/Xcode.app/Contents/Developer/iphoneentitlements
$ cd /Applications/Xcode.app/Contents/Developer/iphoneentitlements
$ wget http://www.alexwhittemore.com/iphone/gen_entitlements.txt
$ mv gen_entitlements.txt gen_entitlements.py
$ chmod 755 gen_entitlements.py

修改工程设置

Add Build Phrase -> Add Run Script,输入以下内容:

1
2
3
4
5
export CODESIGN_ALLOCATE=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/codesign_allocate
if [ "${PLATFORM_NAME}" == "iphoneos" ]; then
/Developer/iphoneentitlements401/gen_entitlements.py "my.company.${PROJECT_NAME}" "${BUILT_PRODUCTS_DIR}/${WRAPPER_NAME}/${PROJECT_NAME}.xcent";
codesign -f -s "iPhone Developer" --entitlements "${BUILT_PRODUCTS_DIR}/${WRAPPER_NAME}/${PROJECT_NAME}.xcent" "${BUILT_PRODUCTS_DIR}/${WRAPPER_NAME}/"
fi

参考资料:

http://hi.baidu.com/jaywclove/blog/item/0782355562849cdab645ae14.html

iOS中Unix环境配置

软件源地址:/etc/apt/sources.list.d/

  1. 安装aptitude:
1
$ apt-get install aptitude
  1. 使用aptitude搜索软件包:
1
$ aptitude search vim

Linux/Unix用户必备工具:

1
$ sudo apt-get install less vim git python screen

通过命令行发短信:

1
$ sudo apt-get install sendsms

Bash + Screen + Vim 配置

screen默认主键是C-a,这个很不方便,C-a在emacs风格的bash下是到行首,而在vim中是增1。

最好改为其他键。由于screen的快捷键大多在键盘左半区域,所以最好也在左边。

C-q, C-s 终端占用,不能使用。

bash的emacs风格快捷键(部分)

C-w 清空输入 C-e 行尾 C-r 历史搜索 C-t 交换字母 C-a 行首 C-f 右移 C-z 暂停 C-c 结束 C-p 上一条命令 C-n 下一条命令

可以选择的:C-t, C-x, C-v

vim普通模式键盘绑定

C-w 切换窗口 C-e 上升1行 C-r redo C-t pop标签栈 C-a 增1 C-d 下半页 C-f 下一页 C-x 减1 C-v 块操作

可以选择的:C-s, C-x, C-c

结论

取交集得: C-x

Mac下使用

由于mac下只有左边有Control,所以需要选择一个右边的按键。

vim中:

C-p 上一个文件 C-n 下一个文件 C-b 上一页 C-o 还没搞清楚 C-u 上半页 C-[ 不能用,否则vim中无法使用escape键。 C-] ctags中定位tag。

bash中: C-l 清屏 C-m 不能用,否则bash中无法回车。 C-k

综上,选择使用C-,在screen中配置为:

1
escape ^\\

有时需要在screen中用ssh登陆服务器,然后再开一个screen,这时要另外选择一个eacape键。

由于在第二个screen中比较少用ctags,所以综合考虑,选择C-]。

参考:

http://houbolin.cn/blog/2009/12/03/linux-%E4%B8%8Bscreen%E5%91%BD%E4%BB%A4/

https://wiki.archlinux.org/index.php/GNU_Screen

Vim技巧

  1. 查看光标处系统函数man手册:
1
shift + k
  1. c代码折叠

对于如下风格的c代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
void test() {

    if(1) {
        printf("hello\n");
    } else {
        printf("you should never see this.\n");
    }

    switch(ch) {
        case 'a':
            printf("hello\n");
            break;
        default:
            printf("hello\n");
            break;
    }

    while(1) {
        if(1) {
            break;
        }
        printf("you should never see this.\n");
    }
}

折叠结果如下:

1
2
3
4
5
6
7
8
9
 1 void test() {
 2
 3 +---  2 : if(1) {---------------------------------------------------
 5 +---  3 : } else {--------------------------------------------------
 8
 9 +---  8 : switch(ch) {----------------------------------------------
17
18 +---  6 : while(1) {------------------------------------------------
24 }

实现上述折叠的vim配置为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
function MyFoldfun(lineNum)
    if getline(a:lineNum+1)=~'^{'
        return 'a1'
    elseif getline(a:lineNum)=~'^}'
        return 's1'
    elseif getline(a:lineNum+1)=~'.\+}.\+{'
        return 's1'
    elseif getline(a:lineNum)=~'.\+}.\+{'
        return 'a1'
    elseif getline(a:lineNum)=~'.\+}'
        return 's1'
    elseif getline(a:lineNum)=~'.\+{'
        return 'a1'
    elseif getline(a:lineNum)=~' \+case '
        return 'a1'
    elseif getline(a:lineNum+1)=~' \+case '
        return 's1'
    elseif getline(a:lineNum+1)=~' \+default:'
        return 's1'
    else
        return '='
    endif
endfunction

set foldexpr=MyFoldfun(v:lnum)

其中函数为设置缩进,最后一行设置折叠表达式为上述函数。