forked from bestpractical/sd
-
Notifications
You must be signed in to change notification settings - Fork 1
/
sdticket.vim
103 lines (92 loc) · 3.42 KB
/
sdticket.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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
" vim:et:sw=2:fdm=marker:
" SD Ticket Syntax File
" Maintainer: Yo-An Lin < cornelius.howl@gmail.com >
" URL: http://www.vim.org/scripts/script.php?script_id=2614
" Last Change: 08/17/2009
" Version: 0.2
" Intro:
"
" This syntax file is for ticket create/update template of SD (a
" peer-to-peer bug tracking system)
" http://syncwith.us/
"
" Usage:
" To let vim know the editing file is an SD ticket, add the following to
" your .vimrc and copy or link this file to your vim syntax directory
" (usually ~/.vim/syntax):
"
" au BufNewFile,BufRead *
" \ if getline(1) =~ '\(required ticket metadata\)\|\(errors in this ticket\)' |
" \ setf sdticket |
" \ endif
"
" For version 5.x: Clear all syntax items.
" For version 6.x: Quit when a syntax file was already loaded.
if version < 600
syntax clear
elseif exists("b:current_syntax")
finish
endif
" takes the string output of 'sd settings', offsets for the start and end of
" the JSON value of a setting not including the [], and returns a list of the
" elements with the quotes stripped
func! s:ConvertSubstrToList(str, start, end)
return map(
\ split(
\ strpart(
\ a:str, a:start, a:end - a:start,
\ ),
\ ',',
\ ),
\ "substitute( v:val, '\"', '', 'g' )",
\ )
endfunc
syn region sdHeader start="^===" end="===$"
syn region sdComment start="^#" end="$"
syn region sdColumn start="^\w\+:\@=" end=":"
" try to get the valid statuses, components, milestones etc. from the settings
" for the current sd replica
" assumes SD_REPO is set and sd command is sd, otherwise will fall back to
" defaults
let s:settings = system("sd settings")
if s:settings =~ '\(not found\)\|\(Compilation failed\)'
" user is running some wrapper script or sd is broken; use sd defaults
syn keyword sdStatus new open closed stalled rejected
syn keyword sdComponent core ui docs tests
syn keyword sdMilestone alpha beta 1.0
else
" parse the settings we found and setup syntax for them
let s:milestones_offset = matchend(s:settings, "milestones: [")
let s:closing_bracket_offset = match(s:settings, "]", s:milestones_offset)
let s:milestones = s:ConvertSubstrToList(s:settings, s:milestones_offset, s:closing_bracket_offset)
let s:components_offset = matchend(s:settings, "components: [")
let s:closing_bracket_offset = match(s:settings, "]", s:components_offset)
let s:components = s:ConvertSubstrToList(s:settings, s:components_offset, s:closing_bracket_offset)
let s:statuses_offset = matchend(s:settings, "statuses: [")
let s:closing_bracket_offset = match(s:settings, "]", s:statuses_offset)
let s:statuses = s:ConvertSubstrToList(s:settings, s:statuses_offset, s:closing_bracket_offset)
for s:list in [s:milestones, s:components, s:statuses]
for s:group in ['sdMilestone', 'sdComponent', 'sdStatus']
let s:syntax = 'syn keyword ' . s:group . ' ' . join(s:list)
exec s:syntax
endfor
endfor
endif
if version >= 508 || !exists("did_sdticket_syn_inits")
if version < 508
let did_sdticket_syn_inits = 1
command -nargs=+ HiLink hi link <args>
else
command -nargs=+ HiLink hi def link <args>
endif
" The default highlighting.
HiLink sdHeader Comment
HiLink sdComment Comment
HiLink sdColumn Label
" do we want these to be different colours?
HiLink sdStatus Type
HiLink sdMilestone Type
HiLink sdComponent Type
delcommand HiLink
endif
let b:current_syntax = "sdticket"