2012-10-22 71 views
3

我想在vim中爲我自定義的文件類型創建一個語法文件。部分語法是這一行vim - 如何匹配語法文件中的鏈接序列

entry: 1,02:15:00,03:15:00,56,Some String 

我想分別匹配每個部分來分配不同的顏色。 entry應該是一個部分,1應該是一個部分,02:15:00應該是一個部分,03:15:00應該是不同的部分,56又一部分,Some String不同部分,以及所有,作爲一部分。每一個都應該有不同的命名,所以我可以根據需要用不同的顏色給它們着色。

我能與contains配合他們,但類似的值(第一次和第二次)得到相同的名稱。我也嘗試使用nextgroup到鏈接連他們一個,但是這有許多名字我需要單獨顏色給我留下了,(有原始文件中的許多逗號不喜歡簡單的例子,我這​​裏顯示)。

有沒有辦法以適當的方式做這樣的語法高亮?

回答

3

您可以

" Adjust the below to make commas have another color. 
" It is common that instead of defining colors directly you link 
" new highlighting groups to some standard one. 
hi def link MySyntaxComma Delimiter 

hi def link MySyntaxCommaAfterNumber  MySyntaxComma 
hi def link MySyntaxCommaAfterFirstTime MySyntaxComma 
hi def link MySyntaxCommaAfterSecondTime MySyntaxComma 
hi def link MySyntaxCommaAfterSecondNumber MySyntaxComma 

你也可以使用一個循環與:execute隱藏重複規則鏈接的所有逗號名稱之一:

syntax match MySyntaxEntryStart /^entry:\s*/ nextgroup=MySyntaxNumber1 
let s:rules=[['Number1', '\d\+'], ['Time1', '\d\d:\d\d:\d\d'], ['Time2', '\d\d:\d\d:\d\d'], ['Number2', '\d\+'], ['String', '.*']] 
while !empty(s:rules) 
    let [s:name, s:reg]=remove(s:rules, 0) 
    let s:cmd='syntax match MySyntax'.s:name.' /'.s:reg.'/ contained' 
    if !empty(s:rules) 
     let s:cmd.=' nextgroup=MySyntaxCommaAfter'.s:name 
     execute 'syntax match MySyntaxCommaAfter'.s:name.' /,/ contained nextgroup=MySyntax'.s:rules[0][0] 
     execute 'hi def link MySyntaxCommaAfter'.s:name.' MySyntaxComma' 
    endif 
    execute s:cmd 
endwhile 
unlet s:rules s:cmd s:name s:reg 
+0

如果你想想看,這是一樣的作爲他們每個人的着色,因爲我仍然需要鏈接他們。你的建議是一個好的做法。最初的問題是有很多逗號,所以我想也許有''separator'或'inbetween'之類的命令,就像'start'和'end'一樣。我會標記你的答案,因爲我猜這是最好的。 – ccit

+0

@ccit使用一個分隔符匹配規則不能擁有正常的nextgroup鏈。你可以做的最好的做法是把所有的臃腫組合成一個更小的循環:execute(將用例子更新答案)。 – ZyX

+0

你太棒了。新的建議正是我需要的。我從來沒有想過使用編程(循環等)來解決它。因此,聰明的解決方案也是一個投票。謝謝。 – ccit