2008-06-24 22:58:06 +00:00
" Vim syntax file
" Language: git commit file
2010-01-06 20:54:52 +01:00
" Maintainer: Tim Pope <vimNOSPAM@tpope.org>
2008-06-24 22:58:06 +00:00
" Filenames: *.git/COMMIT_EDITMSG
2023-12-28 12:48:27 -05:00
" Last Change: 2023 Dec 28
2008-06-24 22:58:06 +00:00
if exists ( "b:current_syntax" )
2010-05-21 12:05:36 +02:00
finish
2008-06-24 22:58:06 +00:00
endif
2022-01-08 21:51:59 +00:00
scriptencoding utf -8
2008-06-24 22:58:06 +00:00
syn case match
syn sync minlines = 50
2022-01-08 21:51:59 +00:00
syn sync linebreaks = 1
2008-06-24 22:58:06 +00:00
if has ( "spell" )
2010-05-21 12:05:36 +02:00
syn spell toplevel
2008-06-24 22:58:06 +00:00
endif
syn include @gitcommitDiff syntax /diff .vim
2022-01-08 21:51:59 +00:00
syn region gitcommitDiff start = /\%(^diff --\%(git\|cc\|combined\) \)\@=/ end = /^\%(diff --\|$\|@@\@!\|[^[:alnum:]\ +-]\S\@!\)\@=/ fold contains = @gitcommitDiff
2008-06-24 22:58:06 +00:00
2023-12-28 12:48:27 -05:00
if get ( g :, 'gitcommit_summary_length' ) < 0
syn match gitcommitSummary "^.*$" contained containedin = gitcommitFirstLine nextgroup = gitcommitOverflow contains = @Spell
elseif get ( g :, 'gitcommit_summary_length' , 1 ) > 0
exe 'syn match gitcommitSummary "^.*\%<' . ( get ( g :, 'gitcommit_summary_length' , 50 ) + 1 ) . 'v." contained containedin=gitcommitFirstLine nextgroup=gitcommitOverflow contains=@Spell'
endif
2008-06-24 22:58:06 +00:00
syn match gitcommitOverflow ".*" contained contains = @Spell
2022-01-08 21:51:59 +00:00
syn match gitcommitBlank "^.\+" contained contains = @Spell
syn match gitcommitFirstLine "\%^.*" nextgroup = gitcommitBlank , gitcommitComment skipnl
let s :scissors = 0
let s :l = search ( '^[#;@!$%^&|:] -\{24,\} >8 -\{24,\}$' , 'cnW' , '' , 100 )
if s :l = = 0
let s :l = line ( '$' )
elseif getline ( s :l ) [0 ] ! = # getline ( s :l - 1 ) [0 ]
let s :scissors = 1
endif
let s :comment = escape ( ( matchstr ( getline ( s :l ) , '^[#;@!$%^&|:]\S\@!' ) . '#' ) [0 ], '^$.*[]~\"/' )
2019-12-05 22:47:25 +01:00
2022-01-08 21:51:59 +00:00
if s :scissors
let s :comment .= ' -\{24,\} >8 -\{24,\}$'
exe 'syn region gitcommitComment start="^' . s :comment . '" end="\%$" contains=gitcommitDiff'
2019-12-05 22:47:25 +01:00
else
2022-01-08 21:51:59 +00:00
exe 'syn match gitcommitComment "^' . s :comment . '.*"'
2019-12-05 22:47:25 +01:00
endif
2022-01-08 21:51:59 +00:00
exe 'syn match gitcommitTrailers "\n\@<=\n\%([[:alnum:]-]\+\s*:.*\|(cherry picked from commit .*\)\%(\n\s.*\|\n[[:alnum:]-]\+\s*:.*\|\n(cherry picked from commit .*\)*\%(\n\n*\%(' . s :comment . '\)\|\n*\%$\)\@="'
2019-12-05 22:47:25 +01:00
2022-01-08 21:51:59 +00:00
unlet s :l s :comment s :scissors
syn match gitcommitTrailerToken "^[[:alnum:]-]\+\s*:" contained containedin = gitcommitTrailers
syn match gitcommitHash "\<\x\{40,}\>" contains = @NoSpell display
syn match gitcommitOnBranch "\%(^. \)\@<=On branch" contained containedin = gitcommitComment nextgroup = gitcommitBranch skipwhite
syn match gitcommitOnBranch "\%(^. \)\@<=Your branch .\{-\} '" contained containedin = gitcommitComment nextgroup = gitcommitBranch skipwhite
2012-04-13 23:04:47 +02:00
syn match gitcommitBranch "[^ ']\+" contained
2022-01-08 21:51:59 +00:00
syn match gitcommitNoBranch "\%(^. \)\@<=Not currently on any branch." contained containedin = gitcommitComment
syn match gitcommitHeader "\%(^. \)\@<=\S.*[:: ]\%(\n^$\)\@!$" contained containedin = gitcommitComment
syn region gitcommitAuthor matchgroup = gitCommitHeader start = /\%(^. \)\@<=\%(Author\|Committer\|Date\):/ end = /$/ keepend oneline contained containedin = gitcommitComment transparent
syn match gitcommitHeader "\%(^. \)\@<=commit\%( \x\{40,\}$\)\@=" contained containedin = gitcommitComment nextgroup = gitcommitHash skipwhite
syn match gitcommitNoChanges "\%(^. \)\@<=No changes$" contained containedin = gitcommitComment
2008-06-24 22:58:06 +00:00
2022-01-08 21:51:59 +00:00
syn match gitcommitType "\%(^.\t\)\@<=[^[:punct:][:space:]][^/:: ]*[^[:punct:][:space:]][:: ]\ze " he = e -1 contained containedin = gitcommitComment nextgroup = gitcommitFile skipwhite
syn match gitcommitFile ".\{-\}\%($\| -> \)\@=" contained nextgroup = gitcommitArrow
syn match gitcommitArrow " -> " contained nextgroup = gitcommitFile
syn match gitcommitUntrackedFile "\%(^.\t\)\@<=[^:: /]*\%(/.*\)\=$" contained containedin = gitcommitComment
2008-06-24 22:58:06 +00:00
2022-01-08 21:51:59 +00:00
syn region gitcommitUntracked start = /^\z(.\) Untracked files:$/ end = /^\z1\=$\|^\z1\@!/ contains = gitcommitHeader containedin = gitcommitComment containedin = gitcommitComment contained transparent fold
syn region gitcommitDiscarded start = /^\z(.\) Change\%(s not staged for commit\|d but not updated\):$/ end = /^\z1\=$\|^\z1\@!/ contains = gitcommitHeader , gitcommitDiscardedType containedin = gitcommitComment containedin = gitcommitComment contained transparent fold
syn region gitcommitSelected start = /^\z(.\) Changes to be committed:$/ end = /^\z1$\|^\z1\@!/ contains = gitcommitHeader , gitcommitSelectedType containedin = gitcommitComment containedin = gitcommitComment contained transparent fold
syn region gitcommitUnmerged start = /^\z(.\) Unmerged paths:$/ end = /^\z1\=$\|^\z1\@!/ contains = gitcommitHeader , gitcommitUnmergedType containedin = gitcommitComment containedin = gitcommitComment contained transparent fold
2008-06-24 22:58:06 +00:00
2022-01-08 21:51:59 +00:00
syn match gitcommitUntrackedFile "\%(^.\t\)\@<=.*" contained containedin = gitcommitUntracked
2016-08-30 23:26:57 +02:00
2022-01-08 21:51:59 +00:00
syn match gitcommitDiscardedType "\%(^.\t\)\@<=[^[:punct:][:space:]][^/:: ]*[^[:punct:][:space:]][:: ]\ze " he = e -1 contained nextgroup = gitcommitDiscardedFile skipwhite
syn match gitcommitSelectedType "\%(^.\t\)\@<=[^[:punct:][:space:]][^/:: ]*[^[:punct:][:space:]][:: ]\ze " he = e -1 contained nextgroup = gitcommitSelectedFile skipwhite
syn match gitcommitUnmergedType "\%(^.\t\)\@<=[^[:punct:][:space:]][^/:: ]*[^[:punct:][:space:]][:: ]\ze " he = e -1 contained nextgroup = gitcommitUnmergedFile skipwhite
syn match gitcommitDiscardedFile "\S.\{-\}\%($\| -> \)\@=" contained nextgroup = gitcommitDiscardedArrow
syn match gitcommitSelectedFile "\S.\{-\}\%($\| -> \)\@=" contained nextgroup = gitcommitSelectedArrow
syn match gitcommitUnmergedFile "\S.\{-\}\%($\| -> \)\@=" contained nextgroup = gitcommitUnmergedArrow
2008-06-24 22:58:06 +00:00
syn match gitcommitDiscardedArrow " -> " contained nextgroup = gitcommitDiscardedFile
syn match gitcommitSelectedArrow " -> " contained nextgroup = gitcommitSelectedFile
2022-01-08 21:51:59 +00:00
syn match gitcommitUnmergedArrow " -> " contained nextgroup = gitcommitUnmergedFile
2008-06-24 22:58:06 +00:00
hi def link gitcommitSummary Keyword
2022-01-08 21:51:59 +00:00
hi def link gitcommitTrailerToken Label
2008-06-24 22:58:06 +00:00
hi def link gitcommitComment Comment
2022-01-08 21:51:59 +00:00
hi def link gitcommitHash Identifier
2008-06-24 22:58:06 +00:00
hi def link gitcommitOnBranch Comment
hi def link gitcommitBranch Special
2010-01-06 20:54:52 +01:00
hi def link gitcommitNoBranch gitCommitBranch
2008-06-24 22:58:06 +00:00
hi def link gitcommitDiscardedType gitcommitType
hi def link gitcommitSelectedType gitcommitType
2010-01-06 20:54:52 +01:00
hi def link gitcommitUnmergedType gitcommitType
2008-06-24 22:58:06 +00:00
hi def link gitcommitType Type
2010-01-06 20:54:52 +01:00
hi def link gitcommitNoChanges gitcommitHeader
2008-06-24 22:58:06 +00:00
hi def link gitcommitHeader PreProc
hi def link gitcommitUntrackedFile gitcommitFile
hi def link gitcommitDiscardedFile gitcommitFile
hi def link gitcommitSelectedFile gitcommitFile
2010-01-06 20:54:52 +01:00
hi def link gitcommitUnmergedFile gitcommitFile
2008-06-24 22:58:06 +00:00
hi def link gitcommitFile Constant
hi def link gitcommitDiscardedArrow gitcommitArrow
hi def link gitcommitSelectedArrow gitcommitArrow
2010-01-06 20:54:52 +01:00
hi def link gitcommitUnmergedArrow gitcommitArrow
2008-06-24 22:58:06 +00:00
hi def link gitcommitArrow gitcommitComment
"hi def link gitcommitOverflow Error
hi def link gitcommitBlank Error
let b :current_syntax = "gitcommit"