1
0
mirror of https://github.com/SpaceVim/SpaceVim.git synced 2025-01-23 13:50:05 +08:00

perf(co-author): complete co-author info

This commit is contained in:
Eric Wong 2024-06-20 09:18:23 +08:00
parent b2a354c0ad
commit 377b7d716b
5 changed files with 75 additions and 1 deletions

View File

@ -47,6 +47,11 @@
" SPC g h r undo cursor hunk
" SPC g h v preview cursor hunk
" <
" @subsection commit omni function
" This layer also provides an omnifunc for git commit messages. It supports:
" 1. complete commit title, `fix:`, `doc:` etc.
" 2. complete github issue list
" 3. complete co-author info
if exists('s:git_plugin')

View File

@ -6,6 +6,7 @@
" License: GPLv3
"=============================================================================
let s:list = SpaceVim#api#import('data#list')
let s:pr_kind = g:spacevim_gitcommit_pr_icon
let s:issue_kind = g:spacevim_gitcommit_issue_icon
@ -62,19 +63,56 @@ let s:commit_types = [
\ ]
" https://docs.github.com/en/pull-requests/committing-changes-to-your-project/creating-and-editing-commits/creating-a-commit-with-multiple-authors
" https://stackoverflow.com/questions/58525836/git-magic-keywords-in-commit-messages-signed-off-by-co-authored-by-fixes
" https://www.reddit.com/r/git/comments/13d565i/git_trailers_what_are_they_for/
" https://alchemists.io/articles/git_trailers
" https://git-scm.com/docs/git-interpret-trailers
" https://gitlab.com/gitlab-org/gitlab-foss/-/issues/31640
" https://archive.kernel.org/oldwiki/git.wiki.kernel.org/index.php/CommitMessageConventions.html
let s:git_trailers = [
\ {
\ 'word' : 'Co-Authored-By:',
\ 'menu' : 'multiple commit author'
\ },
\ ]
function! s:find_last_branch() abort
let reflog = systemlist('git reflog')
for log in reflog
" e059b76ca HEAD@{15}: checkout: moving from doc-help to master
if log =~# 'HEAD@{\d\+}: checkout: '
return matchstr(log, 'HEAD@{\d\+}: checkout: moving from \zs\S*')
endif
endfor
return ''
endfunction
function! s:generate_co_author() abort
let last_branch = s:find_last_branch()
call SpaceVim#logger#info('last branch:' . last_branch)
return s:list.uniq(systemlist('git log -n 5 --format="%aN <%aE>" ' . last_branch))
endfunction
function! SpaceVim#plugins#gitcommit#complete(findstart, base) abort
if a:findstart
let s:complete_ol = 0
let s:complete_type = 0
let s:complete_trailers = 0
let s:complete_co_author = 0
let line = getline('.')
let start = col('.') - 1
while start > 0 && line[start - 1] !=# ' ' && line[start - 1] !=# '#'
while start > 0 && line[start - 1] !=# ' ' && line[start - 1] !=# '#' && line[start - 1] !=# ':'
let start -= 1
endwhile
if line[start - 1] ==# '#'
let s:complete_ol = 1
elseif line('.') ==# 1 && start ==# 0
let s:complete_type = 1
elseif line('.') !=# 1 && start ==# 0
let s:complete_trailers = 1
elseif getline('.') =~# '^Co-Authored-By:' && start >= 14
let s:complete_co_author = 1
endif
return start
else
@ -82,6 +120,10 @@ function! SpaceVim#plugins#gitcommit#complete(findstart, base) abort
return s:complete_pr(a:base)
elseif s:complete_type == 1
return s:complete('types')
elseif s:complete_trailers == 1
return s:complete('trailers')
elseif s:complete_co_author == 1
return s:complete('co-author')
endif
let res = []
for m in s:cache_commits()
@ -101,6 +143,10 @@ endfunction
function! s:complete(what) abort
if a:what ==# 'types'
return s:commit_types
elseif a:what ==# 'trailers'
return s:git_trailers
elseif a:what ==# 'co-author'
return s:generate_co_author()
else
return []
endif

View File

@ -2423,6 +2423,11 @@ The following key bindings will be definded when the `git` layer is loaded.
SPC g h r undo cursor hunk
SPC g h v preview cursor hunk
<
COMMIT OMNI FUNCTION
This layer also provides an omnifunc for git commit messages. It supports:
1. complete commit title, `fix:`, `doc:` etc.
2. complete github issue list
3. complete co-author info
==============================================================================
GITHUB *SpaceVim-layers-github*

View File

@ -12,6 +12,7 @@ lang: zh
- [启用模块](#启用模块)
- [模块选项](#模块选项)
- [快捷键](#快捷键)
- [Commit message 补全](#commit-message-补全)
<!-- vim-markdown-toc -->
@ -57,3 +58,11 @@ lang: zh
| `SPC g h a` | stage current hunk |
| `SPC g h r` | undo cursor hunk |
| `SPC g h v` | preview cursor hunk |
## Commit message 补全
在编辑 git commit message 时,可以使用快捷键 `ctrl-x_ctrl-o` 进行补全,可以补全:
1. 标题前缀, 如 `fix:`、`doc:` 等;
2. GitHub issue 列表;
3. 上一次使用分支的 author 信息,便于添加 co-author

View File

@ -11,6 +11,7 @@ description: "This layer adds extensive support for git"
- [Install](#install)
- [Layer options](#layer-options)
- [Key bindings](#key-bindings)
- [Omnifunc of commit message](#omnifunc-of-commit-message)
<!-- vim-markdown-toc -->
@ -56,3 +57,11 @@ if you want to use `fugitive` instead:
| `SPC g h a` | stage current hunk |
| `SPC g h r` | undo cursor hunk |
| `SPC g h v` | preview cursor hunk |
## Omnifunc of commit message
This layer also provides omnifunc of commit message. The key binding is `ctrl-x_ctrl-o` in insert mode.
1. complete commit title prefix, `fix:`, `doc:` etc.
2. complete github issue list
3. complete co-author info