如果從未在Vim里使用過代碼折疊,你不知道你都錯過了什么。 閱讀`:help usr_28`并花費時間在日常工作中使用它。 一旦到了銘記于指的程度,你就可以繼續本章了。
## 折疊類型
Vim支持六種不同的決定如何折疊你的文本的折疊類型。
### Manual
你手動創建折疊并且折疊將被Vim儲存在內存中。 當你關閉Vim時,它們也將一并煙消云散,而下次你編輯文件時將不得不重新創建。
在你把它跟一些自定義的創建折疊的映射結合起來時,這種方式會很方便。 在本書中,我們不會這么做,但當你想這么做的時候,它會幫上忙。
### Marker
Vim基于特定的字符組合折疊你的代碼。
這些字符通常放置于注釋中(比如`// {{{`), 不過在有些語言里,你可以使用該語言自己的語法代替,比如javascript的`{`和`}`。
純粹為了你的編輯器,用注釋割裂你的代碼看上去有點丑,但好處是你可以定制特定的折疊。 如果你想以特定的方式組織一個大文件,這個類型將是非常棒的選擇。
### Diff
在diff文件時使用該特定的折疊類型。我們不會討論它,因為Vim會自動使用它。
### Expr
這讓你可以用自定義的Vimscript來決定折疊的位置。它是最為強大的方式,不過也需要最繁重的工作。 下一章我們將講到它。
### Indent
Vim使用你的代碼的縮進來折疊。同樣縮進等級的代碼折疊到一塊,空行則被折疊到周圍的行一起去。
這是最便捷的方式,因為你的代碼已經縮進過了;你僅僅需要啟動它。 這將是我們用來折疊Potion代碼的第一種方式。
## Potion折疊
讓我們再一次看一下Potion實例代碼:
~~~
factorial = (n):
total = 1
n to 1 (i):
total *= i.
total.
10 times (i):
i string print
'! is: ' print
factorial (i) string print
"\n" print.
~~~
函數體和循環體已經縮進好了。這意味著我們可以不怎么費力就能實現一些基本的縮進。
在我們開始之前,在`total *= i`上添加一個注釋,這樣我們就有一個供測試的多行內部塊。 你將在做練習的時候學到為什么我們需要這么做,但暫時先信任我。現在文件看上去就像這樣:
~~~
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.
~~~
在你的Potion插件的版本庫下創建一個`ftplugin`文件夾,然后在里面創建一個`potion`文件夾。 最后,在_`potion`文件夾_里面創建一個`folding.vim`文件。
不要忘了每次Vim設置一個buffer的`filetype`為`potion`時,它都會執行這個文件中的代碼。 (因為它位于一個叫`potion`的文件夾)
將所有的折疊相關的代碼放在同一個文件顯然是一個好主意,它能幫我們維護我們的插件的繁多的功能。
在這個文件中加入下面一行:
~~~
setlocal foldmethod=indent
~~~
關閉Vim,重新打開`factoria.pn`。用`zR`,`zM`和`za`嘗試折疊功能。
一行Vimscript代碼就能帶來一些有用的折疊!這真是太酷了!
你可能注意到`factorial`函數的內循環里面的那幾行不能折疊,盡管它們縮進了。 為什么會這樣?
事實上,在使用`indent`折疊時,Vim默認忽略以`#`字符開頭的行。 這在編輯C文件時很有用(這時`#`表示一個預編譯指令),但在編輯其他文件時不怎么有意義。
讓我們在`ftplugin/potion/folding.vim`中添加多一行來修復問題:
~~~
setlocal foldmethod=indent
setlocal foldignore=
~~~
關閉并重新打開`factorial.pn`,現在內部塊可以正常地折疊了。
## 練習
閱讀`:help foldmethod`.
閱讀`:help fold-manual`.
閱讀`:help fold-marker`和`:help foldmarker`.
閱讀`:help fold-indent`.
閱讀`:help fdl`和`:help foldlevelstart`.
閱讀`:help foldminlines`.
閱讀`:help foldignore`.
- 前言
- 鳴謝
- 預備知識
- 打印信息
- 設置選項
- 基本映射
- 模式映射
- 精確映射
- Leaders
- 編輯你的Vimrc文件
- Abbreviations
- 更多的Mappings
- 鍛煉你的手指
- 本地緩沖區的選項設置和映射
- 自動命令
- 本地緩沖區縮寫
- 自動命令組
- Operator-Pending映射
- 更多Operator-Pending映射
- 狀態條
- 負責任的編碼
- 變量
- 變量作用域
- 條件語句
- 比較
- 函數
- 函數參數
- 數字
- 字符串
- 字符串函數
- Execute命令
- Normal命令
- 執行normal!
- 基本的正則表達式
- 實例研究:Grep 運算符(Operator),第一部分
- 實例研究:Grep運算符(Operator),第二部分
- 實例研究:Grep運算符(Operator),第三部分
- 列表
- 循環
- 字典
- 切換
- 函數式編程
- 路徑
- 創建一個完整的插件
- 舊社會下的插件配置方式
- 新希望:用Pathogen配置插件
- 檢測文件類型
- 基本語法高亮
- 高級語法高亮
- 更高級的語法高亮
- 基本折疊
- 高級折疊
- 段移動原理
- Potion段移動
- 外部命令
- 自動加載
- 文檔
- 發布
- 還剩下什么?