Code Monkey home page Code Monkey logo

coc-git's Introduction

coc-git

Git integration of coc.nvim.

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

Supporting

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

Patreon donate button PayPal donate button

Install

In your vim/neovim, run command:

:CocInstall coc-git

Why

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

Features

  • 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": ["gitlab.example.com", "gitlab.com"]

Configuration

  • 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: ["gitlab.com"]

  • 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",

Usage

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 : ''
endfunction

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.

Keymaps

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)

Commands

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

F.A.Q

Q: Virtual text not working.

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

License

MIT

coc-git's People

Contributors

antoinemadec avatar asermax avatar black-desk avatar chemzqm avatar davidmh avatar fannheyward avatar gera2ld avatar happylinks avatar hjylewis avatar hlidotbe avatar hp4k1h5 avatar iamcco avatar indexxuan avatar joosepalviste avatar maswor avatar micke avatar omjadas avatar paprende avatar pierrecapo avatar rcarriga avatar sandangel avatar sigvef avatar tlvince avatar tobiwild avatar vegerot avatar voldikss avatar weirongxu avatar xingyibiao avatar yannham avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.