2011-03-26 141 views
3

我想在vim中爲任務列表創建自定義語法突出顯示。vim自定義語法突出顯示

任務項目以連字符開頭。兩種類型的任務項目是相關的:(a)沒有'@done'標籤的項目。 (b)帶有@done標籤的項目。 (a)和(b)需要以不同的方式突出顯示。

我使用的是taskpaper,它工作正常,但問題是,我試圖使它適用於跨越多行的任務項目。例如:

- Regular item (works) 
- Completed item @done (works) 
- Multi-line item. This item continues on to 
    the line below. (doesn't work) 
- Multi-line completed item. This item continues 
    on to the line below. (doesn't work). @done 

taskpaper作品的高亮文件前兩個,但不是第二雙。作爲一種變通方法的黑客,我想這對於上述最後一種情況:

syn region multLineDoneItem start="{" end="}" fold 
HiLink multLineDoneItem NonText 

但現在,我不得不以紀念用大括號多行已完成的項目,像這樣:

- {Multi-line completed item. This item continues 
    on to the line below. (workaround works).} 

我已經已經搜索了stackexchange和其他地方。我將不勝感激任何幫助! :)

回答

5

您可以嘗試在您的語法區域的末尾部分使用\ze正則表達式原子。這將允許您匹配所有內容,但不包括下一個任務。我沒有看過你如何做匹配,但這樣的事情可能會起作用。

syn region muiltLineItem  start="^-" end="\(\s*\n)\+\ze^-" fold  
syn region multiLineDoneItem start="^-" end="@done\s*\n\(\s*\n\)*\ze^-" fold 
HiLink multiLineItem Normal 
HiLink multiLineDoneItem NonText 

我還沒有測試過這個,但我認爲它或類似的東西應該工作。如果您想考慮縮進,\z正則表達式原子將允許您保留具有相同縮進的匹配行。

UPDATE:

試試這個:

syn match multilineItem "^-\_.\{-}\ze\(\n-\|\%$\)" fold 
syn match multilineDoneItem "^-\(\%(\_^-\)\@!\_.\)\{-}@done\s*\n\ze" fold 
command -nargs=+ HiLink highlight default link <args> 
HiLink multilineItem Normal 
HiLink multilineDoneItem NonText 
delcommand HiLink 

哦,也是這應該適用於所有的四個案件,而不僅多線項目。

+0

嗯,謝謝,但問題似乎是,在你上面提到的建議中,一切都以匹配multiLineDoneItem結尾,因爲它以「^ _」開頭。所以vim在第一個項目(即使它不完整)啓動multiLineDoneItem,並且不停止匹配直到文件結束。 :( – PonyEars 2011-03-28 01:44:14

+0

嗯,是的,我絕對簡化了這個,試試這個更新,讓我知道你是怎麼做的,我已經用你的例子測試過了,它似乎工作得很好,也許可以做更多的擴展照顧緩衝區中的任何其他文本,但它應該是一個很好的起點。 – 2011-03-28 18:42:44

+0

哇,這是一個了不起的正則表達式,非常感謝!是的,這是一個很好的起點,所以我要將它標記爲已回答。現在有很多案例(我沒有提到過),但現在還不行,但在我問你更多問題之前,我會嘗試幾件事情,但我並不完全明白但是:爲什麼在multilineDoneItem regexp的末尾有一個'\ ze'?當找到起始模式時,'(\%(\ _^- \)\ @!'應該會停止匹配,對吧? – PonyEars 2011-03-31 01:39:16