2.4.3 • Public • Published


    Git integration of coc.nvim.

    Note: many useful features not implemented, it's recommended to use plugin like vim-fugitive at the same time.


    If you like my extension, consider supporting me on Patreon or PayPal:

    Patreon donate button PayPal donate button


    In your vim/neovim, run command:

    :CocInstall coc-git


    • Always async.
    • Always refresh on TextChange.
    • Powerful list support.
    • Semantic commit and github issues completion support.


    • Sign support for git status of current buffer.
    • Git status of current project, by g:coc_git_status.
    • Git status of current buffer, byb:coc_git_status.
    • Git status of current line, byb:coc_git_blame for statusline, and addGBlameToVirtualText for inline blames.
    • Git related lists, including issues, gfiles, gstatus, commits, branches & bcommits
    • Keymaps for git chunks, including <Plug>(coc-git-chunkinfo) <Plug>(coc-git-nextchunk) & <Plug>(coc-git-prevchunk) ,
    • Commands for chunks, including git.chunkInfo git.chunkStage git.chunkUndo and more.
    • Keymaps for git conflicts, including <Plug>(coc-git-nextconflict), <Plug>(coc-git-prevconflict), <Plug>(coc-git-keepcurrent), <Plug>(coc-git-keepincoming) & <Plug>(coc-git-keepboth).
    • Completion support for semantic commit.
    • Completion support for GitHub/GitLab issues.

    Note for GitHub issues completion support:

    • GITHUB_API_TOKEN=xxx needs to be set in env to fetch issues from private repositories

    Note for GitLab issues completion support:

    • current only API v4 support, which availabled since GitLab 9.0
    • GITLAB_PRIVATE_TOKEN=XXX needs to be set in env, check Personal access tokens
    • GitLab host needs to be set in coc-settings.json, for example "git.gitlab.hosts": ["", ""]


    • git.command: Command for git, could be absolute path of git executable., default: "git"

    • git.remoteName: Remote name for fetch github issues., default: "origin"

    • git.browserRemoteName: Remote name for browserOpen and copyUrl., default: ""

    • git.browserBranchName: Branch name for browserOpen and copyUrl., default: ""

    • git.urlMode: URL mode for browserOpen and copyUrl, you can set it to "permalink". default: "normal"

    • git.urlFix: a object to configure the url style of copyUrl and browserOpen, make this two command support other git services like gitlab and gitea. default: {}

    • git.issueFormat: Formatting string for issue completion. Supported interpolation variables: %i - issue id. %r - repository name. %o - organization/owner name. %t - issue title. %b - issue body. %c - issue created at. %a - issue author. %u - issue url., default: "#%i"

    • git.virtualTextPrefix: Prefix of git blame infomation to virtual text, require virtual text feature of neovim., default: " "

    • git.addGBlameToVirtualText: Add git blame information to virtual text, require virtual text feature of neovim., default: false

    • git.addGBlameToBufferVar: Add git blame information to b:coc_git_blame., default: false

    • git.branchCharacter: Branch character used with g:coc_git_status, default: ""

    • git.changedDecorator: Git changed decorator used with g:coc_git_status, default: "*"

    • git.conflictedDecorator: Git conflicted decorator used with g:coc_git_status, default: "x"

    • git.stagedDecorator: Git staged decorator used with g:coc_git_status, default: "●"

    • git.untrackedDecorator: Git untracked decorator used with g:coc_git_status, default: "…"

    • git.enableGlobalStatus: Enable global g:coc_git_status., default: true

    • git.enableGutters: Enable gutters in sign column., default: true

    • git.realtimeGutters: Update gutters in realtime, default: true., default: true

    • git.signPriority: Priority of sign gutters, default to 10.

    • git.changedSign.text: Text of changed sign., default: "~"

    • git.changedSign.hlGroup: Highlight group for changed sign., default: "DiffChange"

    • git.addedSign.text: Text of added sign., default: "+"

    • git.addedSign.hlGroup: Highlight group for added sign., default: "DiffAdd"

    • git.removedSign.text: Text of removed sign., default: "_"

    • git.removedSign.hlGroup: Highlight group for removed sign., default: "DiffDelete"

    • git.topRemovedSign.text: Text of top removed sign., default: "‾"

    • git.topRemovedSign.hlGroup: Highlight group for top removed sign., default: "DiffDelete"

    • git.changeRemovedSign.text: Text of change removed sign., default: "≃"

    • git.changeRemovedSign.hlGroup: Highlight group for change removed sign., default: "DiffChange"

    • git.semanticCommit.filetypes: Enabled filetypes, default: ["gitcommit","gina-commit"]

    • git.semanticCommit.scope: Commit message with scope field, default: true

    • git.splitWindowCommand: Command used when split new window for show commit., default: "above sp"

    • git.showCommitInFloating: Show commit in floating or popup window, default: false

    • git.gitlab.hosts: Custom GitLab hosts, default: [""]

    • git.conflict.enabled: Enable highlight conflict lines, default: true

    • git.conflict.current.hlGroup: Highlight group for the current version of a merge conflict, default: "DiffChange"

    • git.conflict.incoming.hlGroup: Highlight group for the incoming version of a merge conflict., default: "DiffAdd"

    more information, see package.json

    Note for user from vim-gitgutter, if your have highlight groups defined for vim-gitgutter, you can use:

    "git.addedSign.hlGroup": "GitGutterAdd",
    "git.changedSign.hlGroup": "GitGutterChange",
    "git.removedSign.hlGroup": "GitGutterDelete",
    "git.topRemovedSign.hlGroup": "GitGutterDelete",
    "git.changeRemovedSign.hlGroup": "GitGutterChangeDelete",


    Statusline integration

    • g:coc_git_status including git branch and current project status.
    • b:coc_git_status including changed lines of current buffer.
    • b:coc_git_blame including blame info of current line.

    Example for lightline user:

    " lightline
    let g:lightline = {
      \ 'active': {
      \   'left': [
      \     [ 'mode', 'paste' ],
      \     [ 'ctrlpmark', 'git', 'diagnostic', 'cocstatus', 'filename', 'method' ]
      \   ],
      \   'right':[
      \     [ 'filetype', 'fileencoding', 'lineinfo', 'percent' ],
      \     [ 'blame' ]
      \   ],
      \ },
      \ 'component_function': {
      \   'blame': 'LightlineGitBlame',
      \ }
    \ }
    function! LightlineGitBlame() abort
      let blame = get(b:, 'coc_git_blame', '')
      " return blame
      return winwidth(0) > 120 ? blame : ''

    If you're not using statusline plugin, you can add them to statusline by:

    set statusline^=%{get(g:,'coc_git_status','')}%{get(b:,'coc_git_status','')}%{get(b:,'coc_git_blame','')}

    User autocmd

    autocmd User CocGitStatusChange {command}

    Triggered after the g:coc_git_status b:coc_git_status b:coc_git_blame has changed.

    Could be used for update the statusline.


    Create keymappings like:

    " navigate chunks of current buffer
    nmap [g <Plug>(coc-git-prevchunk)
    nmap ]g <Plug>(coc-git-nextchunk)
    " navigate conflicts of current buffer
    nmap [c <Plug>(coc-git-prevconflict)
    nmap ]c <Plug>(coc-git-nextconflict)
    " show chunk diff at current position
    nmap gs <Plug>(coc-git-chunkinfo)
    " show commit contains current position
    nmap gc <Plug>(coc-git-commit)
    " create text object for git chunks
    omap ig <Plug>(coc-git-chunk-inner)
    xmap ig <Plug>(coc-git-chunk-inner)
    omap ag <Plug>(coc-git-chunk-outer)
    xmap ag <Plug>(coc-git-chunk-outer)


    Use command :CocCommand to open commands and type git. to get all git related commands.

    • :CocCommand git.copyUrl Copy url of current line to clipboard
    • :CocCommand git.chunkInfo Show chunk info under cursor.
    • :CocCommand git.chunkUndo Undo current chunk.
    • :CocCommand git.chunkStage Stage current chunk.
    • :CocCommand git.diffCached Show cached diff in preview window.
    • :CocCommand git.showCommit Show commit of current chunk.
    • :CocCommand git.browserOpen Open current line in browser
    • :CocCommand git.foldUnchanged Fold unchanged lines of current buffer.
    • :CocCommand git.toggleGutters Toggle git gutters in sign column.
    • :CocCommand git.push push code of current branch to remote.

    Work with git lists

    To open a specified coc list, you have different ways:

    • Run :CocList and select the list by <CR>.

    • Run :CocList and type name of list for completion.

    • Create keymap for open specified list with list options, like:

      nnoremap <silent> <space>g  :<C-u>CocList --normal gstatus<CR>

    To toggle list mode, use <C-o> and i.

    To move up&down on insertmode, use <C-j> and <C-k>

    To run a action, press <tab> and select the action.

    For more advance usage, checkout :h coc-list.

    Issue autocomplete from multiple GitHub repositories

    To enable autocompletion of issues from multiple GitHub repositories, put a comma-separated list of issue repository specifiers in the git config variable coc-git.issuesources. An issue repository specifier looks like this: github/neoclide/coc-git.

    • The first part specifies the issue provider, currently only "github" is supported
    • The second part specifies the organization or owner of the repository
    • The third part specifies the repository name

    Multiple repositories can be specified using comma separation, like this: github/neoclide/coc-git,github/neoclide/coc.nvim


    Q: Virtual text not working.

    A: Make sure your neovim support virtual text by command :echo exists('*nvim_buf_set_virtual_text').





    npm i coc-git

    DownloadsWeekly Downloads






    Unpacked Size

    763 kB

    Total Files


    Last publish


    • avatar