我目前正在爲Vim開發一個插件來管理清單。Vim腳本編制:匹配表達式並計算折線
我目前在語法文件中使用「:setlocal foldmethod = indent」來處理每個清單文檔中的所有摺疊。但是,我想創建一個更靈活的摺疊功能,並且不會依賴線條的縮進來確定它是否摺疊。
下面是一個例子清單:
+ Parent
* Child
* Child
* Child
當用戶按壓了「+父」線<leader>
VV,它把它摺疊下方的線,因爲它們縮進一個級別。這樣做的問題在於,foldmethod可以在其他緩衝區和摺疊線附近進行摺疊,而不需要摺疊。
這裏是我怎麼想的處理它至今:
function! FoldLines()
let l:line = getline(line(".") + 1)
" If next line is a child
if match(l:line, '^\s*\*') >= 0
" Loop until blank line is found, and store line numbers in a list
endif
" Select lines from list and fold
endfunction
我不知道如何處理循環和摺疊。有什麼建議麼?
UPDATE
好,karategeek6的解決方案可在一定程度上,但我沒有提到我的插件也切換清單項。
例子:
+ Parent
× Child - Toggled
* Child - Standard
我可能是錯的,但我不認爲foldexpr將能夠處理與兩行*和開頭×。
我已經試過:
set foldexpr=strlen(substitute(substitute(getline(v:lnum),'\\s','',\"g\"),'[^[*|×]].*','',''))
,但似乎並沒有工作,要麼。
如果你已經把'[^ [* |×]]',嘗試'[^ * x]'。 – Johnsyweb 2011-06-04 06:42:54
@Johnsyweb, 謝謝。這個工作更好一些,但由於某種原因,它不喜歡當我的+ Parent行被關閉後的第一行。不過,如果第一個孩子沒有看到它,它會摺疊。 – 2011-06-04 07:00:43