From 509e77f41702c1272e4e83d9ee5ae2d93414a297 Mon Sep 17 00:00:00 2001 From: Daniel Harding Date: Mon, 14 Sep 2015 15:57:19 +0100 Subject: [PATCH 1/3] Support customized core.commentChar The syntax rules in gitcommit.vim were hard-coded for '#' as the commit message comment character. Now, allow the comment character to be configured, and where necessary, use :exec to dynamically generate the syntax rules using the appropriate comment character. --- syntax/gitcommit.vim | 80 ++++++++++++++++++++++++++------------------ 1 file changed, 48 insertions(+), 32 deletions(-) diff --git a/syntax/gitcommit.vim b/syntax/gitcommit.vim index 1e98348..896ae4e 100644 --- a/syntax/gitcommit.vim +++ b/syntax/gitcommit.vim @@ -15,44 +15,60 @@ if has("spell") syn spell toplevel endif -syn include @gitcommitDiff syntax/diff.vim -syn region gitcommitDiff start=/\%(^diff --\%(git\|cc\|combined\) \)\@=/ end=/^\%(diff --\|$\|#\)\@=/ fold contains=@gitcommitDiff +if exists("g:git_comment_char") + if g:git_comment_char == "auto" + let s:comment_char = substitute(system("git config core.commentchar"), '\n$', "", "") + if s:comment_char == "" + let s:comment_char = "#" + endif + else + let s:comment_char = g:git_comment_char + endif + if s:comment_char == '\\' || s:comment_char == '^' + let s:comment_char = '\' . s:comment_char + endif +else + let s:comment_char = "#" +endif + +syn include @gitcommitDiff syntax/diff.vim +exec 'syn region gitcommitDiff start=/\%(^diff --\%(git\|cc\|combined\) \)\@=/ end=/^\%(diff --\|$\|[' . s:comment_char . ']\)\@=/ fold contains=@gitcommitDiff' -syn match gitcommitFirstLine "\%^[^#].*" nextgroup=gitcommitBlank skipnl -syn match gitcommitSummary "^.\{0,50\}" contained containedin=gitcommitFirstLine nextgroup=gitcommitOverflow contains=@Spell -syn match gitcommitOverflow ".*" contained contains=@Spell -syn match gitcommitBlank "^[^#].*" contained contains=@Spell -syn match gitcommitComment "^#.*" -syn match gitcommitHead "^\%(# .*\n\)\+#$" contained transparent -syn match gitcommitOnBranch "\%(^# \)\@<=On branch" contained containedin=gitcommitComment nextgroup=gitcommitBranch skipwhite -syn match gitcommitOnBranch "\%(^# \)\@<=Your branch .\{-\} '" contained containedin=gitcommitComment nextgroup=gitcommitBranch skipwhite -syn match gitcommitBranch "[^ ']\+" contained -syn match gitcommitNoBranch "\%(^# \)\@<=Not currently on any branch." contained containedin=gitcommitComment -syn match gitcommitHeader "\%(^# \)\@<=.*:$" contained containedin=gitcommitComment -syn region gitcommitAuthor matchgroup=gitCommitHeader start=/\%(^# \)\@<=\%(Author\|Committer\):/ end=/$/ keepend oneline contained containedin=gitcommitComment transparent -syn match gitcommitNoChanges "\%(^# \)\@<=No changes$" contained containedin=gitcommitComment +exec 'syn match gitcommitFirstLine "\%^[^' . s:comment_char . '].*" nextgroup=gitcommitBlank skipnl' +syn match gitcommitSummary "^.\{0,50\}" contained containedin=gitcommitFirstLine nextgroup=gitcommitOverflow contains=@Spell +syn match gitcommitOverflow ".*" contained contains=@Spell +exec 'syn match gitcommitBlank "^[^' . s:comment_char . '].*" contained contains=@Spell' +exec 'syn match gitcommitComment "^[' . s:comment_char . '].*"' +exec 'syn match gitcommitHead "^\%([' . s:comment_char . '] .*\n\)\+[' . s:comment_char . ']$" contained transparent' +exec 'syn match gitcommitOnBranch "\%(^[' . s:comment_char . '] \)\@<=On branch" contained containedin=gitcommitComment nextgroup=gitcommitBranch skipwhite' +exec 'syn match gitcommitOnBranch "\%(^[' . s:comment_char . '] \)\@<=Your branch .\{-\} ''" contained containedin=gitcommitComment nextgroup=gitcommitBranch skipwhite' +syn match gitcommitBranch "[^ ']\+" contained +exec 'syn match gitcommitNoBranch "\%(^[' . s:comment_char . '] \)\@<=Not currently on any branch." contained containedin=gitcommitComment' +exec 'syn match gitcommitHeader "\%(^[' . s:comment_char . '] \)\@<=.*:$" contained containedin=gitcommitComment' +exec 'syn region gitcommitAuthor matchgroup=gitCommitHeader start=/\%(^[' . s:comment_char . '] \)\@<=\%(Author\|Committer\):/ end=/$/ keepend oneline contained containedin=gitcommitComment transparent' +exec 'syn match gitcommitNoChanges "\%(^[' . s:comment_char . '] \)\@<=No changes$" contained containedin=gitcommitComment' -syn region gitcommitUntracked start=/^# Untracked files:/ end=/^#$\|^#\@!/ contains=gitcommitHeader,gitcommitHead,gitcommitUntrackedFile fold -syn match gitcommitUntrackedFile "\t\@<=.*" contained +exec 'syn region gitcommitUntracked start=/^[' . s:comment_char . '] Untracked files:/ end=/^[' . s:comment_char . ']$\|^[' . s:comment_char . ']\@!/ contains=gitcommitHeader,gitcommitHead,gitcommitUntrackedFile fold' +syn match gitcommitUntrackedFile "\t\@<=.*" contained -syn region gitcommitDiscarded start=/^# Change\%(s not staged for commit\|d but not updated\):/ end=/^#$\|^#\@!/ contains=gitcommitHeader,gitcommitHead,gitcommitDiscardedType fold -syn region gitcommitSelected start=/^# Changes to be committed:/ end=/^#$\|^#\@!/ contains=gitcommitHeader,gitcommitHead,gitcommitSelectedType fold -syn region gitcommitUnmerged start=/^# Unmerged paths:/ end=/^#$\|^#\@!/ contains=gitcommitHeader,gitcommitHead,gitcommitUnmergedType fold +exec 'syn region gitcommitDiscarded start=/^[' . s:comment_char . '] Change\%(s not staged for commit\|d but not updated\):/ end=/^[' . s:comment_char . ']$\|^[' . s:comment_char . ']\@!/ contains=gitcommitHeader,gitcommitHead,gitcommitDiscardedType fold' +exec 'syn region gitcommitSelected start=/^[' . s:comment_char . '] Changes to be committed:/ end=/^[' . s:comment_char . ']$\|^[' . s:comment_char . ']\@!/ contains=gitcommitHeader,gitcommitHead,gitcommitSelectedType fold' +exec 'syn region gitcommitUnmerged start=/^[' . s:comment_char . '] Unmerged paths:/ end=/^[' . s:comment_char . ']$\|^[' . s:comment_char . ']\@!/ contains=gitcommitHeader,gitcommitHead,gitcommitUnmergedType fold' -syn match gitcommitDiscardedType "\t\@<=[[:lower:]][^:]*[[:lower:]]: "he=e-2 contained containedin=gitcommitComment nextgroup=gitcommitDiscardedFile skipwhite -syn match gitcommitSelectedType "\t\@<=[[:lower:]][^:]*[[:lower:]]: "he=e-2 contained containedin=gitcommitComment nextgroup=gitcommitSelectedFile skipwhite -syn match gitcommitUnmergedType "\t\@<=[[:lower:]][^:]*[[:lower:]]: "he=e-2 contained containedin=gitcommitComment nextgroup=gitcommitUnmergedFile skipwhite -syn match gitcommitDiscardedFile ".\{-\}\%($\| -> \)\@=" contained nextgroup=gitcommitDiscardedArrow -syn match gitcommitSelectedFile ".\{-\}\%($\| -> \)\@=" contained nextgroup=gitcommitSelectedArrow -syn match gitcommitUnmergedFile ".\{-\}\%($\| -> \)\@=" contained nextgroup=gitcommitSelectedArrow -syn match gitcommitDiscardedArrow " -> " contained nextgroup=gitcommitDiscardedFile -syn match gitcommitSelectedArrow " -> " contained nextgroup=gitcommitSelectedFile -syn match gitcommitUnmergedArrow " -> " contained nextgroup=gitcommitSelectedFile +syn match gitcommitDiscardedType "\t\@<=[[:lower:]][^:]*[[:lower:]]: "he=e-2 contained containedin=gitcommitComment nextgroup=gitcommitDiscardedFile skipwhite +syn match gitcommitSelectedType "\t\@<=[[:lower:]][^:]*[[:lower:]]: "he=e-2 contained containedin=gitcommitComment nextgroup=gitcommitSelectedFile skipwhite +syn match gitcommitUnmergedType "\t\@<=[[:lower:]][^:]*[[:lower:]]: "he=e-2 contained containedin=gitcommitComment nextgroup=gitcommitUnmergedFile skipwhite +syn match gitcommitDiscardedFile ".\{-\}\%($\| -> \)\@=" contained nextgroup=gitcommitDiscardedArrow +syn match gitcommitSelectedFile ".\{-\}\%($\| -> \)\@=" contained nextgroup=gitcommitSelectedArrow +syn match gitcommitUnmergedFile ".\{-\}\%($\| -> \)\@=" contained nextgroup=gitcommitSelectedArrow +syn match gitcommitDiscardedArrow " -> " contained nextgroup=gitcommitDiscardedFile +syn match gitcommitSelectedArrow " -> " contained nextgroup=gitcommitSelectedFile +syn match gitcommitUnmergedArrow " -> " contained nextgroup=gitcommitSelectedFile -syn match gitcommitWarning "\%^[^#].*: needs merge$" nextgroup=gitcommitWarning skipnl -syn match gitcommitWarning "^[^#].*: needs merge$" nextgroup=gitcommitWarning skipnl contained -syn match gitcommitWarning "^\%(no changes added to commit\|nothing \%(added \)\=to commit\)\>.*\%$" +exec 'syn match gitcommitWarning "\%^[^' . s:comment_char . '].*: needs merge$" nextgroup=gitcommitWarning skipnl' +exec 'syn match gitcommitWarning "^[^' . s:comment_char . '].*: needs merge$" nextgroup=gitcommitWarning skipnl contained' +syn match gitcommitWarning "^\%(no changes added to commit\|nothing \%(added \)\=to commit\)\>.*\%$" hi def link gitcommitSummary Keyword hi def link gitcommitComment Comment From 603220031db846a3a903972d32eb1e113bac94e6 Mon Sep 17 00:00:00 2001 From: Daniel Harding Date: Mon, 14 Sep 2015 16:25:01 +0100 Subject: [PATCH 2/3] Replace \@<= backreferences with \zs --- syntax/gitcommit.vim | 20 ++++++++++---------- syntax/gitconfig.vim | 6 +++--- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/syntax/gitcommit.vim b/syntax/gitcommit.vim index 896ae4e..290b01d 100644 --- a/syntax/gitcommit.vim +++ b/syntax/gitcommit.vim @@ -40,25 +40,25 @@ syn match gitcommitOverflow ".*" contained contains=@Spell exec 'syn match gitcommitBlank "^[^' . s:comment_char . '].*" contained contains=@Spell' exec 'syn match gitcommitComment "^[' . s:comment_char . '].*"' exec 'syn match gitcommitHead "^\%([' . s:comment_char . '] .*\n\)\+[' . s:comment_char . ']$" contained transparent' -exec 'syn match gitcommitOnBranch "\%(^[' . s:comment_char . '] \)\@<=On branch" contained containedin=gitcommitComment nextgroup=gitcommitBranch skipwhite' -exec 'syn match gitcommitOnBranch "\%(^[' . s:comment_char . '] \)\@<=Your branch .\{-\} ''" contained containedin=gitcommitComment nextgroup=gitcommitBranch skipwhite' +exec 'syn match gitcommitOnBranch "^[' . s:comment_char . '] \zsOn branch" contained containedin=gitcommitComment nextgroup=gitcommitBranch skipwhite' +exec 'syn match gitcommitOnBranch "^[' . s:comment_char . '] \zsYour branch .\{-\} ''" contained containedin=gitcommitComment nextgroup=gitcommitBranch skipwhite' syn match gitcommitBranch "[^ ']\+" contained -exec 'syn match gitcommitNoBranch "\%(^[' . s:comment_char . '] \)\@<=Not currently on any branch." contained containedin=gitcommitComment' -exec 'syn match gitcommitHeader "\%(^[' . s:comment_char . '] \)\@<=.*:$" contained containedin=gitcommitComment' -exec 'syn region gitcommitAuthor matchgroup=gitCommitHeader start=/\%(^[' . s:comment_char . '] \)\@<=\%(Author\|Committer\):/ end=/$/ keepend oneline contained containedin=gitcommitComment transparent' -exec 'syn match gitcommitNoChanges "\%(^[' . s:comment_char . '] \)\@<=No changes$" contained containedin=gitcommitComment' +exec 'syn match gitcommitNoBranch "^[' . s:comment_char . '] \zsNot currently on any branch." contained containedin=gitcommitComment' +exec 'syn match gitcommitHeader "^[' . s:comment_char . '] \zs.*:$" contained containedin=gitcommitComment' +exec 'syn region gitcommitAuthor matchgroup=gitCommitHeader start=/^[' . s:comment_char . '] \zs\%(Author\|Committer\):/ end=/$/ keepend oneline contained containedin=gitcommitComment transparent' +exec 'syn match gitcommitNoChanges "^[' . s:comment_char . '] \zsNo changes$" contained containedin=gitcommitComment' exec 'syn region gitcommitUntracked start=/^[' . s:comment_char . '] Untracked files:/ end=/^[' . s:comment_char . ']$\|^[' . s:comment_char . ']\@!/ contains=gitcommitHeader,gitcommitHead,gitcommitUntrackedFile fold' -syn match gitcommitUntrackedFile "\t\@<=.*" contained +syn match gitcommitUntrackedFile "\t\zs.*" contained exec 'syn region gitcommitDiscarded start=/^[' . s:comment_char . '] Change\%(s not staged for commit\|d but not updated\):/ end=/^[' . s:comment_char . ']$\|^[' . s:comment_char . ']\@!/ contains=gitcommitHeader,gitcommitHead,gitcommitDiscardedType fold' exec 'syn region gitcommitSelected start=/^[' . s:comment_char . '] Changes to be committed:/ end=/^[' . s:comment_char . ']$\|^[' . s:comment_char . ']\@!/ contains=gitcommitHeader,gitcommitHead,gitcommitSelectedType fold' exec 'syn region gitcommitUnmerged start=/^[' . s:comment_char . '] Unmerged paths:/ end=/^[' . s:comment_char . ']$\|^[' . s:comment_char . ']\@!/ contains=gitcommitHeader,gitcommitHead,gitcommitUnmergedType fold' -syn match gitcommitDiscardedType "\t\@<=[[:lower:]][^:]*[[:lower:]]: "he=e-2 contained containedin=gitcommitComment nextgroup=gitcommitDiscardedFile skipwhite -syn match gitcommitSelectedType "\t\@<=[[:lower:]][^:]*[[:lower:]]: "he=e-2 contained containedin=gitcommitComment nextgroup=gitcommitSelectedFile skipwhite -syn match gitcommitUnmergedType "\t\@<=[[:lower:]][^:]*[[:lower:]]: "he=e-2 contained containedin=gitcommitComment nextgroup=gitcommitUnmergedFile skipwhite +syn match gitcommitDiscardedType "\t\zs[[:lower:]][^:]*[[:lower:]]: "he=e-2 contained containedin=gitcommitComment nextgroup=gitcommitDiscardedFile skipwhite +syn match gitcommitSelectedType "\t\zs[[:lower:]][^:]*[[:lower:]]: "he=e-2 contained containedin=gitcommitComment nextgroup=gitcommitSelectedFile skipwhite +syn match gitcommitUnmergedType "\t\zs[[:lower:]][^:]*[[:lower:]]: "he=e-2 contained containedin=gitcommitComment nextgroup=gitcommitUnmergedFile skipwhite syn match gitcommitDiscardedFile ".\{-\}\%($\| -> \)\@=" contained nextgroup=gitcommitDiscardedArrow syn match gitcommitSelectedFile ".\{-\}\%($\| -> \)\@=" contained nextgroup=gitcommitSelectedArrow syn match gitcommitUnmergedFile ".\{-\}\%($\| -> \)\@=" contained nextgroup=gitcommitSelectedArrow diff --git a/syntax/gitconfig.vim b/syntax/gitconfig.vim index c6c56f7..722c65f 100644 --- a/syntax/gitconfig.vim +++ b/syntax/gitconfig.vim @@ -14,9 +14,9 @@ syn case ignore syn sync minlines=10 syn match gitconfigComment "[#;].*" -syn match gitconfigSection "\%(^\s*\)\@<=\[[a-z0-9.-]\+\]" -syn match gitconfigSection '\%(^\s*\)\@<=\[[a-z0-9.-]\+ \+\"\%([^\\"]\|\\.\)*"\]' -syn match gitconfigVariable "\%(^\s*\)\@<=\a\k*\%(\s*\%([=#;]\|$\)\)\@=" nextgroup=gitconfigAssignment skipwhite +syn match gitconfigSection "^\s*\zs\[[a-z0-9.-]\+\]" +syn match gitconfigSection '^\s*\zs\[[a-z0-9.-]\+ \+\"\%([^\\"]\|\\.\)*"\]' +syn match gitconfigVariable "^\s*\zs\a\k*\%(\s*\%([=#;]\|$\)\)\@=" nextgroup=gitconfigAssignment skipwhite syn region gitconfigAssignment matchgroup=gitconfigNone start=+=\s*+ skip=+\\+ end=+\s*$+ contained contains=gitconfigBoolean,gitconfigNumber,gitConfigString,gitConfigEscape,gitConfigError,gitconfigComment keepend syn keyword gitconfigBoolean true false yes no contained syn match gitconfigNumber "\d\+" contained From 99e390e73f0b677f7e6466f1b2d9bff9e895ca84 Mon Sep 17 00:00:00 2001 From: Aaron Schrab Date: Thu, 19 May 2016 18:43:41 -0400 Subject: [PATCH 3/3] Handle `]` as git comment character --- syntax/gitcommit.vim | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/syntax/gitcommit.vim b/syntax/gitcommit.vim index 290b01d..809be54 100644 --- a/syntax/gitcommit.vim +++ b/syntax/gitcommit.vim @@ -24,7 +24,7 @@ if exists("g:git_comment_char") else let s:comment_char = g:git_comment_char endif - if s:comment_char == '\\' || s:comment_char == '^' + if s:comment_char == '\\' || s:comment_char == '^' || s:comment_char == ']' let s:comment_char = '\' . s:comment_char endif else